1417: 【例】【提高】走出迷宫的最短路径
内存限制:120 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:24
解决:13
题目描述
有n*m的迷宫,该迷宫有一个入口,一个出口。编写一程序打印一条从迷宫入口到出口的最短路径,黑色方块的单元表示走不通(用1表示),白色方块的内容表示走的通(用0表示)
只能往上下左右四个方向走,如果有最短路径,保证最短路径一定是唯一的,如果没有路径可以到达,则输出“no way”。
只能往上下左右四个方向走,如果有最短路径,保证最短路径一定是唯一的,如果没有路径可以到达,则输出“no way”。
输入
第一行输入2个整数n和m(n和m都是10~150之间的整数),代表迷宫的行数和列数
接下来n行,每行有m个整数,1代表不可走的点,0代表可走的点
接下来一行,有2个整数s1和s2代表入口的坐标
接下来一行,有2个整数e1和e2代表出口的坐标
接下来n行,每行有m个整数,1代表不可走的点,0代表可走的点
接下来一行,有2个整数s1和s2代表入口的坐标
接下来一行,有2个整数e1和e2代表出口的坐标
输出
输出从入口到出口的最短路径,如果没有路径可达输出“no way”
样例输入 复制
8 5
1 1 1 1 1
0 0 0 0 1
1 1 1 0 1
1 0 0 0 1
1 0 0 1 1
1 0 0 0 1
1 1 1 0 1
1 0 0 0 1
2 1
8 4
样例输出 复制
(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)->(4,3)->(5,3)->(6,3)->(6,4)->(7,4)->(8,4)
提示
#include<bits/stdc++.h>
using namespace std;
#define N 160
int n,m,ex,ey,sx,sy,q[40000][4];
int dx[5]={0,0,1,0,-1};
int dy[5]={0,1,0,-1,0};
struct coord{
int x;
int y;
int k;
};
queue<coord> Q;
bool vis[N][N],f=false;
int a[N][N];
void print(int k){
if(q[k][3]!=0){
print(q[k][3]);
cout<<"->";
}
cout<<'('<<q[k][1]<<','<<q[k][2]<<')';
return;
}
int k=1;
void bfs(int sx,int sy){
coord s={sx,sy,1};
q[1][1]=sx;
q[1][2]=sy;
q[1][3]=0;
vis[sx][sy]=1;
Q.push(s);
while(!Q.empty()){
coord u=Q.front();
int x=u.x,y=u.y,prek=u.k;
Q.pop();
for(int i=1;i<=4;i++){
k++;
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>=1&&ty>=1&&tx<=n&&ty<=m&&a[tx][ty]==0&&vis[tx][ty]!=1){
coord tmp={tx,ty,k};
q[k][1]=tx;
q[k][2]=ty;
q[k][3]=prek;
Q.push(tmp);
vis[tx][ty]=1;
if(tx==ex&&ty==ey){
f=true;
print(k);
return;
}
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
cin>>sx>>sy>>ex>>ey;
bfs(sx,sy);
if(f==false) cout<<"no way";
return 0;
}