POJ2488 dfs回溯

来源:互联网 发布:淘宝退款对买家的影响 编辑:程序博客网 时间:2024/03/29 21:13

和之前的差不多,这个问题关键是字典序输出,遍历顺序弄好了,第一个扫描成功的就是了。

#include<iostream>using namespace std;const int maxN = 27;struct Node{    char x;    int y;};Node answer[maxN];bool check[maxN][maxN];bool flag;int n, p, q;int dx[] = {-2,-2,-1,-1,1,1,2,2};int dy[] = {-1,1,-2,2,-2,2,-1,1};bool jugdeEdge(int x, int y){    return (x < p) && (0 <= x) && (y < q) && (0 <= y) && !(check[x][y]);}void dfs(int x, int y, int steps){    answer[steps].x = x;    answer[steps].y = y;    check[x][y] = true;    if (steps ==  p * q - 1)    {        flag = true;        return ;    }    for (int i = 0; i < 8; i++)    {        int tmpx = x + dx[i];        int tmpy = y + dy[i];        if (jugdeEdge(tmpx,tmpy))        {            check[tmpx][tmpy] = true;            dfs(tmpx, tmpy, steps + 1);            if (flag)            {                return;            }            check[tmpx][tmpy] = false;        }    }}void printResult(int num){    cout << "Scenario #"  << num << ":" <<endl;    if (!flag )    {        cout << "impossible" <<endl;    }    else    {        for (int i = 0; i < q * p; i++)        {            char c = 'A'+answer[i].x;            cout << c << answer[i].y + 1;        }        cout << endl;    }    cout << endl;}int main(){    cin >> n;    for (int k = 0; k < n; k++)    {        cin >> q >> p;        flag = false;        memset(answer,0,sizeof(answer));        memset(check, false,sizeof(check));        for (int i = 0; i < p; i++)        {            for (int j = 0; j < q; j++)            {                dfs(i,j,0);                if (flag)                    break;            }            if (flag)                break;        }        printResult(k + 1);    }}
0 0
原创粉丝点击