1.典型的bfs。
2.难点在剪枝部分。有一个记录所走step的数组,记录到每个点所走的步数,如果一个点没走过,放进队列中,如果一个点走过,比较原来这个点的step值和由当前点计算的值,如果大,另其等于当前点的step值+1;
3.这道题犯了超级低级的错误。。。写好了bfs()函数,结果在main()函数中没有添加bfs();语句,导致调试了好久得不到想要的结果。。。
#include <stdio.h> #include <iostream> #include <queue> #include <cstring> using namespace std; struct Node { int x, y; } sta, end; char a, c; int b, d, i; int step[9][9]; int che[8][2] = {{-1, +2}, {-2, +1}, {+1, +2}, {+2, +1}, {+2, -1}, {+1, -2}, {-1, -2}, {-2, -1}}; bool check(int aa, int bb) { if( aa > 0 && aa <= 8 && bb > 0 && bb <= 8) return true; else return false; } void bfs() { queue <int> q; q.push(sta.x); q.push(sta.y); while(!q.empty()) { int xx = q.front(); q.pop(); int yy = q.front(); q.pop(); if (xx == end.x && yy == end.y) continue; for(i = 0; i <8; i++) { if(!check(xx + che[i][0], yy + che[i][1])) continue; if(!step[xx + che[i][0]][yy + che[i][1]] || step[xx + che[i][0]][yy + che[i][1]] > step[xx][yy] + 1) { step[xx + che[i][0]][yy + che[i][1]] = step[xx][yy] + 1; q.push(xx + che[i][0]); q.push(yy + che[i][1]); } } } } int main() { while(scanf("%c", &a) != EOF) { memset(step, 0, sizeof(step)); scanf("%d", &b); getchar(); sta.x = a - 'a' + 1; sta.y = b; scanf("%c%d", &c, &d); getchar(); end.x = c - 'a' + 1; end.y = d; bfs(); cout << "To get from " << a << b <<" to " << c << d <<" takes " <<step[end.x][end.y]<<" knight moves."<< endl; // cout << sta.x << ' ' << sta.y << ' ' << end.x << ' ' << end.y <<endl; } return 0; }