POJ-2488 A Knight's Journey dfs搜索
简单的dfs搜索,题目要求是骑士可以从任意一点出发走完整个棋盘的路径。字典序输出要注意八个方向的排列顺序。
代码如下:
#include <cstring> #include <cstdlib> #include <cstdio> using namespace std; int N, M, dir[8][2] = {-2, -1, -2, 1, -1, -2, -1, 2, 1, -2, 1, 2, 2, -1, 2, 1}; int visit[10][10], rec[100][2]; bool judge(int x, int y) { if (x < 1 || x > M || y < 1 || y > N) { return false; } else { return true; } } bool dfs(int x, int y, int step) { rec[step][0] = x, rec[step][1] = y; if (step == N*M) { for (int i = 1; i <= step; ++i) { printf("%c%d", rec[i][0]+'A'-1, rec[i][1]); } puts(""); return true; } for (int i = 0; i < 8; ++i) { int xx = x + dir[i][0], yy = y + dir[i][1]; if (!visit[xx][yy] && judge(xx, yy)) { visit[xx][yy] = 1; if(dfs(xx, yy, step+1)) { return true; } visit[xx][yy] = 0; } } return false; } int main() { int T, step, flag; scanf("%d", &T); for (int ca = 1; ca <= T; ++ca) { memset(visit, 0, sizeof (visit)); step = flag = 1; printf("Scenario #%d:\n", ca); scanf("%d %d", &N, &M); for (int i = 1; i <= M && flag; ++i) { // 从列优先搜索,因为要求字典序输出 for (int j = 1; j <= N; ++j) { // 经测试,只要走1,1这一个点就可以了,也就是说如果有解的话,一定从1,1走起 visit[i][j] = 1; if (dfs(i, j, step)) { flag = 0; break; } visit[i][j] = 0; } } if (flag) { puts("impossible"); } if (ca < T) { puts(""); } } return 0; }