POJ 2488 A Knight's Journey

来源:互联网 发布:php服务器怎么绑定域名 编辑:程序博客网 时间:2024/06/05 05:38


本着对深搜掌握不牢的原则,所以找到这倒深搜推荐题~~~


感觉一开始题意理解起来有些困难,其实也就是象棋中的马走遍所有的方格,遍历搜索还是比较简单的,但是路径的保存还是稍稍的卡了那么一下下。。。


最终定下的是用数组与进制的思路来保存的~~~


代码如下:


#include<stdio.h>#include<string.h>int vis[30][30];int divs[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};int flag;int res;int p,q;int num[1000];int t;void dfs(int x,int y,int deep){   // printf("**%d   %d\n",deep,p*q);    if(deep>=p*q)    {        flag=1;        return;    }    for(int i=0;i<8;i++)    {        if((x+divs[i][0])>=0&&(y+divs[i][1])>=0&&(x+divs[i][0])<p&&(y+divs[i][1])<q&&!vis[x+divs[i][0]][y+divs[i][1]])        {            //printf("%d %d\n",x+divs[i][0],y+divs[i][1]);            vis[x+divs[i][0]][y+divs[i][1]]=1;            num[t++]=(x+divs[i][0])*100+(y+divs[i][1]);            dfs(x+divs[i][0],y+divs[i][1],deep+1);            if(flag)                return ;            vis[x+divs[i][0]][y+divs[i][1]]=0;            t--;        }    }}int main(){    int n;    int count=0;    scanf("%d",&n);    while(n--)    {        count++;        memset(vis,0,sizeof(vis));        scanf("%d%d",&p,&q);        t=0;flag=0;        num[t++]=0;        vis[0][0]=1;        dfs(0,0,1);        printf("Scenario #%d:\n",count);        if(flag==1)        {            for(int i=0;i<t;i++)            {                int a=num[i]/100+1;                char c=num[i]%100+'A';                printf("%c%d",c,a);            }        }        else          printf("impossible");        printf("\n\n");    }    return 0;}


0 0