1417: 【例】【提高】走出迷宫的最短路径

内存限制:120 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:24 解决:13

题目描述

有n*m的迷宫,该迷宫有一个入口,一个出口。编写一程序打印一条从迷宫入口到出口的最短路径,黑色方块的单元表示走不通(用1表示),白色方块的内容表示走的通(用0表示)
只能往上下左右四个方向走,如果有最短路径,保证最短路径一定是唯一的,如果没有路径可以到达,则输出“no way”。

输入

第一行输入2个整数n和m(n和m都是10~150之间的整数),代表迷宫的行数和列数
接下来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;
}