poj 2243 Knight Moves

来源:互联网 发布:天津广播电视网络官网 编辑:程序博客网 时间:2024/06/12 15:44
//这题和1915是一样的题目,只不过这题的输入需要进行转换,还有这题没有给出具体的棋盘和棋子的//走法,如果对国际象棋不熟悉的人来讲,是很难读得明白题意的,棋盘和棋子的走法可以参照1915题! #include <iostream>#include <string>#include <map> using namespace std;const int MAX = 15; map<char, int> m; string input1, input2;int l, r, sx, sy, ex, ey, dir[8][2] = {{-2, -1}, {-2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {2, -1}, {2, 1}, {1, 2}}; bool vis[MAX][MAX]; //结构体储存一个点的坐标和到达这个点的步数! struct Info{       int x, y;       int step; }info[MAX*MAX]; //进行宽搜,得出另一个符合要求的坐标点,储存入数组,然后再一一进行搜索! void solve(int x, int y){     if (x >= 0 && x < 8 && y >= 0 && y < 8 && !vis[x][y]){          info[r].x = x;         info[r].y = y;         info[r].step = info[l].step + 1;         vis[x][y] = 1;          r++;      } } void bfs(){     int i, tmpx, tmpy;      info[0].x = sx;     info[0].y = sy;     vis[sx][sy] = 1;      l = 0;//以一个链表的形式进行搜索结果的储存!      r = 1;     while (l != r){           if (info[l].x == ex && info[l].y == ey){               //printf("To get from %s to %s takes %d knight moves.\n", input1, input2, info[l].step);               cout << "To get from " << input1 << " to " << input2 << " takes " << info[l].step << " knight moves." << endl;                break;            }            //八个方向的坐标转换,再一一进行宽搜!            for (i = 0; i < 8; i++){               tmpx = info[l].x + dir[i][0];               tmpy = info[l].y + dir[i][1];               solve(tmpx, tmpy);            }            l++;      }      return ; } int main(){    m['a'] = 1, m['b'] = 2, m['c'] = 3, m['d'] = 4,     m['e'] = 5, m['f'] = 6, m['g'] = 7, m['h'] = 8;     while (cin >> input1 >> input2){          //对输入进行字符串和数字之间的转换!           sx = m[input1[0]] - 1;          sy = input1[1] - 48 - 1;          ex = m[input2[0]] - 1;          ey = input2[1] - 48 - 1;           memset(vis, 0, sizeof(vis));           bfs();     }         system("pause"); } 

原创粉丝点击