A Knight's Journey poj DFS

来源:互联网 发布:关系数据库设计理论 编辑:程序博客网 时间:2024/05/17 02:58

/*挺好的一道DFS。有几个trick。一个就是方向向量的顺序,不需要遍历每一个起始点,则需要按字母第一关键字,数字第二关键字进行向量方向的安排。然后就是图的行列问题。p行去列,实际上存图的时候是x<=q  &&y<=p,这个细节要注意。*/#include <stdio.h>#include <cstring>bool vis[30][30];int ansx[1001];int ansy[1001];int p,q;bool ret;int dx[]= {-2,-2,-1,-1,1,1,2,2};int dy[]= {-1,1,-2,2,-2,2,-1,1};void dfs(int x,int y,int t){    int tempx,tempy;    ansx[t]=x;    ansy[t]=y;    if(t==p*q)    {        ret=true;        return ;    }    for(int i=0; i<8; i++)    {        tempx=x+dx[i];        tempy=y+dy[i];        if(tempx>=1&&tempx<=q&&tempy>=1&&tempy<=p&&!vis[tempx][tempy]&&!ret)        {            vis[tempx][tempy]=true;            dfs(tempx,tempy,t+1);            vis[tempx][tempy]=false;        }    }}int main(){    int t,ca=1;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&p,&q);        printf("Scenario #%d:\n",ca++);        memset(vis,false,sizeof(vis));        memset(ansx,0,sizeof(ansx));        memset(ansy,0,sizeof(ansy));        ret=false;        vis[1][1]=true;        dfs(1,1,1);        if(!ret) printf("impossible\n");        else        {            for(int i=1; i<=p*q; i++)                printf("%c%d",char(ansx[i]+'A'-1),ansy[i]);            printf("\n");        }        printf("\n");    }    return 0;}


原创粉丝点击