A Knight's Journey 这是一个标准的骑士周游问题,做起来还算顺手,但有个细节没有注意,就是按字典顺序输出第一个,所以每次走的顺序是确定的。 #include <iostream> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <string> #include <cstdio> #include <climits> using namespace std; bool ch[30][30]; char pi[70]; char qi[70]; bool yes; int p, q; int foot[8][2] = { -1, -2, 1, -2, -2, -1, 2, -1, -2, 1, 2, 1, -1, 2, 1, 2 }; bool isin(int x, int y) { if (x < 0 || x > p-1 || y < 0 || y > q-1) return false; return true; } void search(int x, int y, int num) { pi[num] = x+'1'; qi[num] = y+'A'; if (yes) return; if (num == q * p -1) { for (int i=0; i < q*p; i++) { printf("%c%c", qi[i], pi[i]); } yes = true; return; } for (int i=0; i < 8; i++) { if (isin(x+foot[i][0], y+foot[i][1]) && !ch[x+foot[i][0]][y+foot[i][1]]) { ch[x+foot[i][0]][y+foot[i][1]] = true; search(x+foot[i][0], y+foot[i][1], num+1); ch[x+foot[i][0]][y+foot[i][1]] = false; } } } int main() { int n; scanf("%d", &n); for (int ti=1; ti <= n; ti++) { scanf("%d%d", &p, &q); if (ti != 1) printf("/n"); printf("Scenario #%d:/n", ti); yes = false; for (int i=0; i < p && !yes; i++) for (int j=0; j < q && !yes; j++) { memset(ch, 0, sizeof(ch)); ch[i][j] = true; search(i, j, 0); } if (!yes) printf("impossible"); printf("/n"); } return 0; }