题目描述:若骑士所处位置为图中马所在的位置,则他可以往图中白点处走
要求:
1第一行首先给出一个整数,表示要测试的数据组数,接下来每一行包含两个整数,第一个整数为矩阵的行数,第二个数为矩阵的列数,矩阵的行从第一行开始依次标记为1,2,....列数从第一列开始依次标记为A,B,C......。
2.骑士从左上角那个点处开始走,判断骑士是否可以遍历矩阵中的所有点,如果可以,请输出字典序最小的路径(路径记录的是当前骑士所在的位置)。如果不可以,请输出“impossible”。
样例输入:
3 1 1 2 3 4 3样例输出:
Scenario #1: A1 Scenario #2: impossible Scenario #3:
A1B3C1A2B4C2A3B1C3A4B2C4
简单的dfs,但是题目上说需要我们按字典最短序输出,那么我们的搜索方向按特殊的搜索方向;
int z[8][2] = { -2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1 };
代码:
#include<iostream> #include<algorithm> using namespace std; int z[8][2] = { -2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1 }; int h, w; int v[1000][1000]; int yes; struct point { int x; int y; }p[1000]; int dfs(int x, int y,int index) { if (index == w * h) { yes = 1; return 1; } for (int i = 0; i < 8; i++) { if ((x + z[i][0]) >= 1 && (x + z[i][0]) <= w && (y + z[i][1]) >= 1 && (y + z[i][1]) <= h&&!v[x + z[i][0]][y + z[i][1]]) { v[x + z[i][0]][y + z[i][1]] = 1; p[index].x = x + z[i][0]; p[index].y = y + z[i][1]; dfs(x + z[i][0], y + z[i][1], index + 1); if (yes) return 1; v[x + z[i][0]][y + z[i][1]] = 0; } } return 0; } int main() { int n; int sum = 1; cin >> n; while (n--) { memset(v, 0, sizeof(v)); int flag = 0; cin >> h >> w; for (int i = 1; i <= w; i++) { for (int j = 1; j <= h; j++) { p[0].x = i; p[0].y = j; memset(v, 0, sizeof(v)); yes = 0; v[i][j] = 1; if (dfs(i, j, 1)) { flag = 1; break; } } if (flag == 1) break; } cout << "Scenario #" << sum++ << ":" << endl; if (flag) { for (int i = 0; i < h*w; i++) { printf("%c%d", p[i].x + 'A' - 1, p[i].y); } cout << endl; } else cout << "impossible" << endl; } return 0; }