A Knight's Journey poj DFS

48 篇文章 0 订阅
14 篇文章 0 订阅

/*挺好的一道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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值