题目描述
XYY最近收到了一个迷宫地图,它是由0或者1组成。
0,0,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
0,1,1,1,1,1,1,0,0
“0”表示道路,“1”表示墙,坐标(0<=n<=8)(0<=m<=8)
在迷宫中,只能上下左右移动。为了更好地研究这张地图,需要知道从地图中的一点到另一点的最小距离。
输入
第一行输入一个T,表示有T组测试数据。
随后T行中每行给出n1,m1,n2,m2,分别表示起点的坐标和终点的坐标。
输出
输出最少的步数,若到达不了,输出“YY” 。
样例输入
3
3 1 5 7
3 1 6 7
0 0 8 0
样例输出
12
11
YY
来源
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
int maze[9][9]={{0,0,1,1,1,1,1,1,1},
{1,0,0,1,0,0,1,0,1},
{1,0,0,1,1,0,0,0,1},
{1,0,1,0,1,1,0,1,1},//把迷宫先输入进去
{1,0,0,0,0,1,0,0,1},
{1,1,0,1,0,1,0,0,1},
{1,1,0,1,0,1,0,0,1},
{1,1,0,1,0,0,0,0,1},
{0,1,1,1,1,1,1,0,0}};
int sx,sy;
int gx,gy;
int d[9][9];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int bfs(){
queue<P> que;
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
d[i][j]=INT_MAX; //bfs模板
que.push(P(sx,sy));
d[sx][sy]=0;
while(que.size()){
P p=que.front();que.pop();
if(p.first==gx&&p.second==gy) break;
for(int i=0;i<4;i++){
int nx=p.first+dx[i],ny=p.second+dy[i];
if(0<=nx&&nx<9&&0<=ny&&ny<9&&maze[nx][ny]!=1&&d[nx][ny]==INT_MAX){
que.push(P(nx,ny));
d[nx][ny]=d[p.first][p.second]+1;
}
}
}
return d[gx][gy];
}
int main(){
int t;
cin>>t;
while(t--){
cin>>sx>>sy>>gx>>gy; //输入起点终点
if(bfs()<=80) //这个值有点邪乎,假如全部都是路,左上角走到右下角最多才80步
cout<<bfs()<<endl; //假如能从起点走到终点,、bfs是会返回具体的坐标的;
else
cout<<"YY"<<endl; //假如走不到,返回的就是一个地址值(10位),肯定很大一个数了
} return 0;
}