题目描述
话说2007年8月5日,Mike博士神秘失踪了,最后发现是被外星人绑架了,幸好外星人目前还是在地球上活动,并且知道外星人不了解地球,幸好,Milk博士身上有无线信号发送装置,我们终于确定了他的位置,必须赶快到那里去救他。
根据无线信号发送装置,我们确定出一张地图,为了尽快寻找到Mike博士,于是这个光荣和艰巨的任务便交给了你,编写程序,通过使用一张地图帮助研究所确定从研究所出发找到Mike博士最短距离。
数据范围: n<=1000
输入格式
第一行为n
第二行为n*n的地图(其中0表示通路,1表示死路)
最后两行每行有两个数字,分别表示研究所的坐标和博士信号所在的位置。
输出格式
一个数字k,表示从研究所出发找到Milk博士的最短距离。
样例输入
10
0100110100
0001110010
1000000001
1000100011
0000101100
1000001100
1001010011
0000010100
0101010000
1001000001
1 7
10 2
输出14
比较规范代码+模板
#include<bits/stdc++.h>
using namespace std;
int next[8][2]= {{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{1,-1},{-1,1},{1,1}};
char mapp[1000+10][1000+10];
int n,beginX,beginY,endX,endY;
struct maps
{
int x,y,step;
};
void bfs(int xx,int yy)
{
maps a,b;
queue<maps>q;
a.x=xx;
a.y=yy;
a.step=0;
q.push(a);
mapp[a.x][a.y]='1';
while(!q.empty())
{
a=q.front();
q.pop();
for(int i=0; i<4; i++)
{
b.x=a.x+next[i][0];
b.y=a.y+next[i][1];
if(b.x>0&&b.x<=n&&b.y>0&&b.y<=n&&mapp[b.x][b.y]=='0')
{
b.step=a.step+1;
q.push(b);
mapp[b.x][b.y]='1';
if(b.x==endX&&b.y==endY)
{
cout<<b.step<<endl;
return ;
}
}
}
}
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
cin>>mapp[i][j];
cin>>beginX>>beginY;
cin>>endX>>endY;
//y11--;
//y2--;
bfs(beginX,beginY);
return 0;
}
此时用深度优先搜索就不行,不会通过,因为数据量太大,效率低
深搜做法:
#include<bits/stdc++.h>
using namespace std;
bool mark[1000+10][1000+10]={false};
char maps[1000+10][1000+10];
int n;
int beginX,beginY,endX,endY;
int mins=99999999;
void bfs(int x,int y,int step)
{
if(x==endX&&y==endY)
{
//cout<<"ok"<<endl;
mins=min(mins,step);
}
int next[8][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{1,-1},{-1,1},{1,1}};
int dx,dy;
for(int i=0;i<8;i++)
{
dx=x+next[i][0];
dy=y+next[i][1];
if(dx>0&&dx<=n&&dy>0&&dy<=n&&!mark[dx][dy]&&maps[dx][dy]!='1')
{
//cout<<dx<<" "<<dy<<endl;
mark[dx][dy]=true;
step++;
bfs(dx,dy,step);
step--;
mark[dx][dy]=false;
}
}
return;
}
int main()
{
cin>>n;
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>maps[i][j];
}
}
cin>>beginX>>beginY>>endX>>endY;
mark[beginX][beginY]=true;
bfs(beginX,beginY,0);
cout<<mins;
return 0;
}
另一种做法注释:
#include<bits/stdc++.h>
using namespace std;
int dx[8]={-1,0,1,0,-1,1,-1,1};
int dy[8]={0,1,0,-1,-1,-1,1,1};
char ma[1001][1001];
int x1,y11,x2,y2,n;
struct akgfhk{
int x,y,step;
}que[1000001];
void bfs(int xx,int yy){
akgfhk a,b;
queue<akgfhk>q;
a.x=xx;
a.y=yy;
a.step=0;
q.push(a);
ma[xx][yy]='1';//
/*int head=0,tail=1,x,y,newx,newy;
que[tail].x=xx;
que[tail].y=yy;
ma[xx][yy]='1';
que[tail].step=0;*/
while(!q.empty()){
a=q.front();
q.pop();
/*head++;
x=que[head].x;
y=que[head].y;*/
for(int i=0;i<4;i++){
/*newx=x+dx[i];
newy=y+dy[i];*/
b.x=a.x+dx[i];
b.y=a.y+dy[i];
if(b.x>0&&b.x<=n&&b.y>0&&b.y<=n&&ma[b.x][b.y]=='0'){
/*tail++;
que[tail].x=newx;
que[tail].y=newy;
que[tail].step=que[head].step+1;
*/
b.step=a.step+1;
q.push(b);
ma[b.x][b.y]='1';
if(b.x==x2&&b.y==y2){
cout<<b.step<<endl;
return ;
}
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>ma[i][j];
cin>>x1>>y11;
cin>>x2>>y2;
//y11--;
//y2--;
bfs(x1,y11);
return 0;
}