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;
}
posted @ 2012-07-12 15:44  沐阳  阅读(276)  评论(0编辑  收藏  举报