——BFS(广搜)的套路化操作

——BFS(广搜)的套路化操作

bfs的核心思想

运用c++stl库中的队列queue
展开对中间状态的判断
对于每次符合条件的元素进行入队操作
不断状态转移后的一个符合题意的结果,即为最优解

###基本模板

		int dx[4]={-1,1,0,0};int dy[4]={0,0,-1,1};//定义四个方向
`		 point s;//s为拥有x,y,step的结构体变量
		 s.x=sx;
		 s.y=sy;
		 s.step = 0;//完成初始化
		 v[s.x ][s.y]=1;int x, y;
		 r.push(s);
		 while(!r.empty())
		 {	x=r.front().x;
		 	y=r.front().y;
		 	if(x==p&&y==q)
		 	{
			 flag = 1;
		 	printf("%d",r.front().step);}
		 	for(int k=0;k<=3;k++)
			{int tx,ty;
		 	tx=x+dx[k];
		 	ty=y+dy[k];
		 	if(a[tx][ty]=='0'&&v[tx][ty]==0)
		 	{
			   point temp;
		 	 temp.x=tx;
		 	 temp.y=ty;
		 	 temp.step=r.front().step+1;
		 	 v[tx][ty]=1;
		 	 r.push(temp);
		 }
			
		 	
		 	
		 }
		 r.pop();	
		 };

其中v[][]为标记数组,a[][]为地图标记数组

####例题

铁达尼克号遇险了 它发出了求救信号。距离最近的哥伦比亚号收到了讯息。时间就是生命,必须尽快赶到那里通过侦测,哥伦比亚要获取了一张海洋图 这张海洋图上划分成了n*n个比较小的单位,用1表示陆地 用0表示海洋 船只能从一个格子移到相邻的4个格子里。 为了尽快赶到出事地点,哥伦比亚号最少要走多少距离。

Input

第一行,n 以下的n*n行为一个0,1矩阵,表示海洋地图
最后一行为4个小于n的整数 表示 哥伦比亚号 和铁达尼克号的坐标

Output

哥伦比亚号到铁达尼克号的最短距离 ,答案精确到整数。

Sample Input Copy

3
001
101
100
1 1 3 3

sample output
4

解答




#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
char a[1005][1005];
int v[1005][1005];
struct point{
	int x;int y;int step;
};
int dx[4]={-1,1,0,0};int dy[4]={0,0,-1,1};

queue <point> r;
int main()
/*
5  4
1 1 2 1
1 1 1 1
2 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3


		
*/
{	int sx,sy,p,q,flag =0,n;
	scanf("%d",&n);
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			scanf(" %c",&a[i][j]);
	scanf("%d %d %d %d",&sx,&sy,&p,&q);
		 //bfs
		 point s;
		 s.x=sx;
		 s.y=sy;
		 s.step = 0;
		 v[s.x ][s.y]=1;int x, y;
		 r.push(s);
		 while(!r.empty())
		 {	x=r.front().x;
		 	y=r.front().y;
		 	if(x==p&&y==q)
		 	{
			 flag = 1;
		 	printf("%d",r.front().step);}
		 	for(int k=0;k<=3;k++)
			{int tx,ty;
		 	tx=x+dx[k];
		 	ty=y+dy[k];
		 	if(a[tx][ty]=='0'&&v[tx][ty]==0)
		 	{
			   point temp;
		 	 temp.x=tx;
		 	 temp.y=ty;
		 	 temp.step=r.front().step+1;
		 	 v[tx][ty]=1;
		 	 r.push(temp);
		 }
			
		 	
		 	
		 }
		 r.pop();	
		 }
		 if(flag ==0)
		 printf("no answer");
		 	return 0;
		 
}




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ctgu20-acm-律

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值