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 1091 Knight Moves
- zoj 1091 Knight Moves
- ZOJ-1091-Knight Moves
- ZOJ1091 Knight Moves
- ZOJ-1091-Knight Moves
- ZOJ-1091-Knight Moves
- zoj 1091 Knight Moves
- zoj 1091 Knight Moves
- zoj 1091 Knight Moves
- zoj1091 Knight Moves
- zoj 1091 Knight Moves
- 单源最短路径 ZOJ 1091 Knight Moves
- UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves
- BFS例题 ZOJ——1091 Knight Moves
- zoj 1091 Knight Moves
- ZOJ 1091 POJ 2935 Knight Moves BFS水题
- ZOJ_1091-Knight Moves
- ZOJ——1091(宽搜)
- ZOJ-1091 Knight Moves(bfs)
- zoj - 1091 - Knight Moves(直接查找法)