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;

}

你可能感兴趣的:(poj)