poj2488

以下是转载内容 侵删 只是学习记录一下

#include<iostream>

#include <cstdio>

#include <cstring>

using namespace std;

int cases, p, q, i;

void dfs(int x, int y, int num);//num用来记录是否全部走过 即路径长度

const int MAX_N = 27;//字典序最多多少

const int dx[8] = {-1, 1, -2, 2, -2, 2, -1, 1};

const int dy[8] = {-2, -2, -1, -1, 1, 1, 2, 2};//只能左右1上下2or左右2上下1

bool visited[MAX_N][MAX_N];

struct Step{

    char x, y;

} path[MAX_N];

bool success;           //是否成功遍历的标记


int main(){

    cin >> cases;

    for(int c = 0; c < cases; c ++){

        success = false;// 先全部标记失败

        scanf("%d%d", &p, &q);//边界范围

        memset(visited, false, sizeof(visited));

        visited[1][1] = true;    //起点

        dfs(1, 1, 1);//a1开始搜索

        printf("Scenario #%d:\n", c);

        if (success)

        {

            for (int i = 1; i <= p * q; i++)

                printf("%c%c", path[i].y, path[i].x);

            printf("\n");

        }

        else

            printf("impossible\n");

        if (c != cases)

            printf("\n");      //注意该题的换行

    }

    return 0;

}

void dfs(int x, int y, int num)

{

    path[num].y = y + 'A' - 1;   //int 转为 char

    path[num].x = x + '0';

    if (num == p * q)// 套路 如果路径查找到最后一个 说明成功

    {

        success = true;

        return;

    }

    for (int i = 0; i < 8; i++)

    {

        int nx = x + dx[i];

        int ny = y + dy[i];// 循环遍历各种走法 nx ny是坐标

        if (0 < nx && nx <= p && 0 < ny && ny <= q && !visited[nx][ny] && !success)//合法范围内,既未走过也没有成功

        {

            visited[nx][ny] = true;

            dfs(nx, ny, num+1);

            visited[nx][ny] = false;    //如果没有成功,撤销该步

        }

    }

}


猜你喜欢

转载自blog.csdn.net/Jazzmine/article/details/78495030