题目大意:
思路:
用BFS广度优先搜索法,来寻找最短的路程。用队列储存找到的结点,先把骑士移动的八个方向表示出来,整个棋盘都初始化0,然后每个方向都搜索一遍,走过的地方设置为1,像撒网一样,把找到的结点放进队列中,再以这个结点为中心,八个方向继续撒网,能走通的地方就继续走,不能走就换方向。
源代码:
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 struct tnode{ 7 int x; 8 int y; 9 int step;10 11 }p,new_dot,t;12 int chess[10][10];13 string a1, a2;14 int dest_x,dest_y;15 int to[8][2] = { -2, 1, -1, 2, 1, 2, 2, 1, 2, -1, 1, -2, -1, -2, -2, -1 }; //骑士初始的八个方向16 int judge(int a, int b) //判断骑士是否还在棋盘内17 {18 if (a >=8 ||a<0||b >=8 ||b<0||chess[a][b]) 19 return 1;20 return 0;21 }22 int bfs()23 {24 25 queue T; 26 memset(chess, 0, sizeof(chess));27 p.x = a1[0] - 'a'; // 骑士开始的位置28 p.y = a1[1] - '1'; 29 p.step = 0;30 chess[p.x][p.y] = 1; //把开始的位置设为131 dest_x = a2[0] - 'a'; //骑士要去的位置32 dest_y = a2[1] - '1';33 T.push(p); //把结点放到队列中34 while (!T.empty())35 { 36 t = T.front();37 T.pop();38 if (t.x == dest_x&&t.y == dest_y) //到达目标位置39 return t.step;40 41 for (int i = 0; i < 8; i++)42 {43 new_dot.x = t.x + to[i][0]; //8个方向,每个方向都遍历一遍44 new_dot.y = t.y + to[i][1]; 45 if (new_dot.x == dest_x&&new_dot.y == dest_y)46 return t.step + 1;47 if (judge(new_dot.x, new_dot.y)) //不是目标点,但是还在棋盘内,继续走48 continue;49 chess[new_dot.x][new_dot.y] = 1;50 new_dot.step = t.step + 1;51 T.push(new_dot); //把新结点放进队列中52 53 }54 }55 56 return 0;57 }58 int main()59 {60 while (cin >> a1 >> a2)61 {62 cout << "To get from " << a1 << " to " << a2 << " takes " << bfs() << " knight moves." << endl;63 }64 system("pause");65 return 0;66 67 }
心得:
以前不了解BFS,一种用来找最短的距离,或者最少次数的算法,就像撒网一样,每次新学一点就会觉得很满足,暑假培训两天了,第一次体验这种生活,虽然辛苦,但是学到东西就觉得很值,就像屠老师说的,好好刷题,开始可以跟着别人的代码写,每个人都有一个过程,坚持总比不坚持收获得多!