DFS/BFS的小白整理(二)

马踏飞燕(BFS)

题目

同样是道模板题/裸题
SDNU1025
题目如图

PS:这题我不会别的方法,,,也不知道有没有非bfs的方法

闲话少说,贴代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int c[8]={2,2,1,1,-1,-1,-2,-2}; //数组c,d分别用来存储马每次所能移动的方位
int d[8]={1,-1,2,-2,2,-2,1,-1};//也可用一个二维数组存储
bool vis[106][106]={0},w=0;//vis数组标记是否已经走过
int m,n,x,y;
void bfs(int a,int b,int k)
{
	if(a==m&&b==n)//马的坐标与燕子的坐标重合(成功到达)
	{
		w=1;return;
	}
	if(k==5)return; //超过步数限制
	for(int i=0;i<8;i++)
	{
		a+=c[i];
		b+=d[i];//走一步
		if(vis[a][b]==0&&a>0&&a<100&&b>0&&b<100)//判断该点是否走过及是否跃出范围
		{
			vis[a][b]=1;bfs(a,b,k+1);vis[a][b]=0;//标记该点并进行下一步搜索
		}
		a-=c[i];//搜索完记得将坐标归位
		b-=d[i];
	}
}
int main()
{
	cin>>x>>y>>m>>n;
	bfs(x,y,1);
	if(w==0)cout<<"N"<<endl;
	else cout<<"Y"<<endl;
	return 0;
}

PS:自我感觉比dfs要好理解一丢丢

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值