poj 2488 简单的搜索

来源:互联网 发布:网络金融理财管理 编辑:程序博客网 时间:2024/05/17 12:53

传送门

题意:问能否从某点出发,走日字遍历所有点,每个点只经过1次。能则输出字典序最小的路径。

思路:昨天看到群里有人探讨这题,今天就顺手做了。这里就是基本的DFS,关于字典序,只要注意搜索下一个点的顺序就能保证。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int m,n;bool v[50][50];int num;int ok;int xx[8]={-1,1,-2,2,-2,2,-1,1};int yy[8]={-2,-2,-1,-1,1,1,2,2};int ax[50],ay[50];void dfs(int x,int y,int s){    v[x][y]=1;    ax[s]=x;    ay[s]=y;    if(s==m*n)    {        ok=1;        printf("Scenario #%d:\n",num++);        for(int i=1;i<=m*n;i++)        {            printf("%c%d",ay[i]+64,ax[i]);        }        printf("\n");        return;    }    for(int i=0;i<8;i++)    {        if(ok)return;        if(x+xx[i]>0&&x+xx[i]<=m&&y+yy[i]>0&&y+yy[i]<=n&&v[x+xx[i]][y+yy[i]]==0)        {            dfs(x+xx[i],y+yy[i],s+1);        }    }    v[x][y]=0;}int main(){    int t;    num=1;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&m,&n);        memset(v,0,sizeof(v));        ok=0;        for(int j=1;j<=n;j++)        {            if(ok)break;            for(int i=1;i<=m;i++)            {                dfs(i,j,1);                if(ok)break;            }        }        if(!ok)printf("Scenario #%d:\nimpossible\n",num++);        printf("\n");    }    return 0;}


原创粉丝点击