poj2488 A Knight's Journey dfs搜索入门

本文介绍了一种国际象棋马走遍整个棋盘的算法,通过字典序的方式从A1出发遍历所有点,并记录下第一种符合要求的路径。

题意:给出一个国际棋盘的大小,判断马能否不重复走过所有格,并记录下其中按字典序排列的第一种路径。

既然是按字典序排列,那么从A1出发一定能到达所有点,以A1为起点开始遍历。


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

int sx[26],sy[26];//存储遍历路径
int p, q, flag, fx, fy, z;
int use[30][30];
int xm[8]={-2,-2,-1,-1,1,1,2,2};
int ym[8]={-1,1,-2,2,-2,2,-1,1};
//注意这里的初始化方法是按照从上至下,从左至右的方式初始化的,这样遍历的方式就会直接是字典序方式

void dfs(int x, int y)
{
    int tx, ty;
    if(fx==p*q)//如果遍历到所有点则返回
    {
        flag=1;return;
    }
    for(int i=0;i<8;i++)
    {
        tx=xm[i]+x;
        ty=ym[i]+y;
        if(tx<0||ty<0||tx>=q||ty>=p||use[tx][ty])
            continue;   //判断下一个点是否符合条件
        use[tx][ty]=1;
        sx[fx++]=tx;sy[fy++]=ty;//将此点加入路径
        dfs(tx,ty);
        if(flag)    return;//找到符合条件的路径则返回退出
        else
        {
            fx--;fy--;use[tx][ty]=0;
            //否则将此点从路径中删除,继续寻找下一个符合条件的点
        }
    }
}

int main()
{
    int t;
    while(scanf("%d",&t)!=EOF)
    {
        for(int i=1;i<=t;i++)
        {
            scanf("%d%d",&p,&q);
            flag=0;fx=fy=0;
            memset(use,0,sizeof(use));
            //初始化第一步,将A1存入路径
            use[0][0]=1;
            sx[fx++]=0;sy[fy++]=0;
            dfs(0,0);
            printf("Scenario #%d:\n",i);
            if(!flag) printf("impossible\n");
            else
            {
                for(int j=0;j<fx;j++)
                    printf("%c%d",'A'+sx[j],1+sy[j]);
                printf("\n");
            }
            if(i!=t)    printf("\n");
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值