骑士问题 C组模拟赛

题目:

这道题形容起来很麻烦,可能看不懂我的代码,就放上来了


题目大意:

8*8的棋盘,有一些障碍物,骑士只可以像象棋中的”马”一样走”日”字,问在x点最少走几步到达y点


解题思路:

深搜/广搜
广搜比较快
不过深搜打起来比较简单
所以我用了深搜


源程序:

#include<cstdio>
#include<cstring>
#include<iostream>
#define min(a,b) a>b?b:a
using namespace std;
int b,a[9][9];
int dx[9]={0,1,-1,2,-2,1,-1,2,-2};
int dy[9]={0,2,-2,1,-1,-2,2,-1,1};
int ans;
void count(int x){ans=min(x,ans); return;}
void dfs(int x1,int y1,int x2,int y2,int p)//x1,y1是当前坐标,x2,y2是目标坐标,p是当前的步数
{
    if (x1==x2&&y1==y2) {count(p); return;}//到目的地了
    if (x1<1||y1<1||x1>8||y1>8||a[x1][y1]<p&&a[x1][y1]>0||a[x1][y1]==-1) return;
    //出棋盘或这是障碍或之前来过了,并且用的步数更少,说明就没用了
    for (int i=1;i<=8;i++)
    {
        int x=x1+dx[i],y=y1+dy[i];
        a[x1][y1]=p;//记录
        dfs(x,y,x2,y2,p+1);//往下走
    }
}
int main()
{
    int lon=0;
    while (scanf("%d",&b),b!=-1)
    {
        memset(a,0,sizeof(a));//初始化
        ans=2147483647;
        char c,ch;
        for (int i=1;i<=b;i++)
        {
            cin>>c>>ch;
            int xx=(int)(c-96),yy=(int)(ch-48);
            a[xx][yy]=-1;
        }
        cin>>c>>ch;
        int x1=c-96,y1=ch-48;
        cin>>c>>ch;
        int x2=c-96,y2=ch-48;//上面一大串读入啊,初始化啊什么的
        dfs(x1,y1,x2,y2,0);//开始搜
        if (ans==2147483647) printf("Board %d: not reachable\n",++lon);
        else printf("Board %d: %d moves\n",++lon,ans);//输出
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值