您的位置:首页 > 其它

zoj1091 Knight Moves

2014-11-02 21:48 330 查看
/*******************************************
总体思路是计算出起始位置到所有位置的最小步数(用二维数组r来储存)
假如目的位置为e4,那么直接输出r[4][3]即可
*******************************************/
#include
#include
#include

int r[8][8];//存放从起始位置到目的位置的最小步数
int x[] = {2, 1, -1, -2, -2, -1, 1, 2};//x和y数组用来存储搜索的八个方向
int y[] = {1, 2, 2, 1, -1, -2, -2, -1};

void dfs(int a, int b, int c)
{
int i;
if(a > 7 || a < 0 || b > 7 || b < 0 || c >= r[a][b])//等号去了则TLE
{
return;//a和b表示r数组下标,假如超过范围,则表示不在棋盘
}	       //c表示步数,假如该位置已搜索过且当前步数大于等于历史值
//则这个方向没有必要搜索,假如该位置没被搜索过,为了不错误返回
//则要在每次输入时对r数组初始化一个很大的值,详见memset语句
r[a][b] = c;
for(i = 0; i < 8; i++)
{
dfs(a + x[i], b + y[i], c + 1);
}
}

int main(void)
{
char s1[11], s2[11];
while(scanf("%s%s", s1, s2) != EOF)
{
//注意r数组中每个值不是1,而是16843009(十进制)
memset(r, 1, sizeof(r));//因为memset函数是按字节赋值,即00000001000000010000000100000001(二进制)
dfs(s1[0] - 'a', s1[1] - '1', 0);
printf("To get from %s to %s takes %d knight moves.\n", s1, s2, r[s2[0] - 'a'][s2[1] - '1']);
}
//system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  zoj 搜索