POJ 2488 A Knight's Journey

来源:互联网 发布:淘宝天猫购物券 编辑:程序博客网 时间:2024/06/11 19:47

 题目连接:POJ 2488


/*这题属于最基础的搜索题,在平时的联系中遇到过很多次,然而每次都放弃了,这次终于耐心的把它敲出来了,看上去好懂,其实敲起来并不容易,卡了好多次才A掉
AC代码如下:
*/#include <stdio.h>#include <algorithm>#include <iostream>#include <cstring>using namespace std;const int maxn=30;int p,q,flag;int dir[8][2]= {{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};   //8个方向的位移量  (切记:字典序!!!)int mark[maxn][maxn],a[maxn][2];int find(int x,int y,int cnt){    int dx,dy;    if(cnt==q*p)                            //全部访问完毕,打印结果    {        for(int i=0; i<cnt; i++)        {            printf("%c%d",a[i][0]+'A',a[i][1]+1);        }        printf("\n\n");        flag=1;                                //记得标记下    }    else    {        for(int i=0; i<8; i++)        {            dx=x+dir[i][0];            dy=y+dir[i][1];            if(dx>=0 && dy>=0 && dx<q && dy<p && !mark[dx][dy] && !flag)            {                mark[dx][dy]=1;                 //标记已访问的点                a[cnt][0]=dx;                a[cnt][1]=dy;                   //记录访问点的坐标                find(dx,dy,cnt+1);                              mark[dx][dy]=0;                 //清除标记,为下一次访问做准备            }        }    }}int main(){    int t,cas=1;    scanf("%d",&t);    while(t--)    {        memset(mark,0,sizeof(mark));        memset(a,-1,sizeof(a));        scanf("%d%d",&p,&q);        printf("Scenario #%d:\n",cas++);        flag=0;        a[0][0]=0;a[0][1]=0;        mark[0][0]=1;        find(0,0,1);        if(!flag)            printf("impossible\n\n");    }    return 0;}


0 0
原创粉丝点击