题目:439 - Knight Moves
题目大意:就是给起点,终点,看最少走几步能从起点到终点。走的方式是采用国际象棋,走日字型。
解题思路:BFS,广度优先遍历。
#include<stdio.h> #include<string.h> #include<queue> using namespace std; struct bit { int x, y; }; const int N = 8; int dir[8][2] = {{-1, -2}, {-2, -1}, {-2, 1}, {-1, 2}, {1, -2}, {2, -1}, {2, 1}, {1, 2}}; char s1[N], s2[N]; queue<bit> q; int path[N + 2][N + 2], visit[N + 2][N + 2]; void bfs(bit k) { visit[k.x][k.y] = 1; if(k.x == s2[1] - '0' && k.y == s2[0] - 'a' + 1) return; q.push(k); while(!q.empty()) { k = q.front(); q.pop(); for(int i = 0; i < N; i++) { int x = k.x + dir[i][0]; int y = k.y + dir[i][1]; if(x > 0 && x <= N && y > 0 && y <= N && visit[x][y] == 0 ) { visit[x][y] = 1; path[x][y] = path[k.x][k.y] + 1; if(x == s2[1] - '0' && y == s2[0] - 'a' + 1) return; bit m; m.x = x; m.y = y; q.push(m); } } } } int main() { while(scanf("%s%s", s1, s2) != EOF) { memset(path, 0, sizeof(path)); memset(visit, 0, sizeof(visit)); bit k; k.x = s1[1] - '0'; k.y = s1[0] - 'a' + 1; bfs(k); if(visit[s2[1]- '0'][s2[0] - 'a' + 1]) printf("To get from %s to %s takes %d knight moves.\n", s1, s2, path[s2[1] - '0'][s2[0] - 'a' + 1]); while(!q.empty()) { q.pop(); } } return 0; }