——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;
}