Can a knight go to a specific place DFS #include <bits/stdc++.h> using namespace std; int dir[8][2] = {-1, -2, -2, -1, -2, 1, -1, 2, 1, 2, 2, 1, 2, -1, 1, -2}; int ans[8][8]; struct knight { int x, y, max; }; knight st, ed; void dfs(int x, int y, int moves); void bfs(knight start); int main() { // freopen("input.in", "r", stdin); char m1[3] = {'\0'}, m2[3] = {'\0'}; while (cin >> m1 >> m2) { if (strcmp(m1, m2) == 0) { cout << "To get from " << m1[0] << m1[1] << " to " << m2[0] << m2[1] << " takes 0 knight moves." << '\n'; } else { memset(ans, 100, sizeof(ans)); st.max = 0; st.x = m1[0] - 'a'; st.y = m1[1] - '1'; ed.x = m2[0] - 'a'; ed.y = m2[1] - '1'; dfs(st.x, st.y, 0); cout << "To get from " << m1[0] << m1[1] << " to " << m2[0] << m2[1] << " takes " << ans[ed.x][ed.y] << " knight moves." << '\n'; } } } void dfs(int x, int y, int moves) { if (x < 0 || x > 7 || y < 0 || y > 7 || ans[x][y] <= moves) return; ans[x][y] = moves; for (int i = 0; i < 8; i++) { int nx = x + dir[i][0]; int ny = y + dir[i][1]; dfs(nx, ny, moves + 1); } } 每个位置都存放一个步数,当来到该位置时,就可以分析是否为更少的步数 BFS int main() { // freopen("input.in", "r", stdin); char m1[3] = {'\0'}, m2[3] = {'\0'}; while (cin >> m1 >> m2) { if (strcmp(m1, m2) == 0) { cout << "To get from " << m1[0] << m1[1] << " to " << m2[0] << m2[1] << " takes 0 knight moves." << '\n'; } else { m = 0; knight start; start.max = 0; start.x = m1[0] - 'a'; start.y = m1[1] - '1'; ed.x = m2[0] - 'a'; ed.y = m2[1] - '1'; bfs(start); cout << "To get from " << m1[0] << m1[1] << " to " << m2[0] << m2[1] << " takes " << m << " knight moves." << '\n'; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { ans[i][j] = 0; } } } } } void bfs(knight start) { queue<knight> k; k.push(start); while (!k.empty()) { auto temp = k.front(); k.pop(); if (temp.x == ed.x && temp.y == ed.y) { m = temp.max; break; } for (int i = 0; i < 8; i++) { int x = temp.x + dir[i][0]; int y = temp.y + dir[i][1]; if (x >= 0 && x < 8 && y >= 0 && y < 8 && !ans[x][y]) { start.x = x; start.y = y; start.max = temp.max + 1; k.push(start); ans[x][y] = 1; } } } } PATH path[start.x][start.y].x=temp.x; path[start.x][start.y].y=temp.y; void PrintPath(int x, int y) { if (x == -1 && y == -1) return; PrintPath(path[x][y].x, path[x][y].y); cout << "(" << char(x + 97) << "," << y + 1 << ") "; } Links BFS