Problem A: 走迷宫问题
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 9 Solved: 3
[Submit][Status][Web Board]
Description
给定一个二维数组 int map[5][5] = {
0 , 1 , 0 , 0 , 0 ,
0 , 1 , 0 , 1 , 0 ,
0 , 0 , 0 , 0 , 0 ,
0 , 1 , 1 , 1 , 0 ,
0 , 0 , 0 , 1 , 0 ,
} ;
Input
输入两个正整数m,n 代表m行,n列的矩阵
输入m*n矩阵元素,它表示一个迷宫,其中“1”表示墙壁,“0”表示可以走的路,只能横着走或者竖着走,不能斜着走
Output
要求编写程序求出从左上角到右下角的最短路径的长度,
Sample Input
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output
8
my answer:
#include<iostream> #include<queue> using namespace std; typedef struct dot{ int x,y; int step; }dot; int n,m; bool in(int x,int y) { if(x>=0&&x<n&&y>=0&&y<m) return true; else return false; } int dx[]={1,0,-1,0}; int dy[]={0,1,0,-1}; int main() { while(cin>>n>>m){ int vis[60][60]; for(int i=0;i!=n;i++){ for(int j=0;j!=m;j++){ cin>>vis[i][j]; } } dot g1,next; int ok=0; g1.x=0; g1.y=0; g1.step=0; queue<dot> q; // while(!q.empty()) q.pop; q.push(g1); int count=0; while(!q.empty()){ dot g; g=q.front();q.pop(); for(int k=0;k<=3;k++){ next.x=g.x+dx[k]; next.y=g.y+dy[k]; next.step=g.step+1; if(in(next.x,next.y)&&!vis[next.x][next.y]){ if(next.x==n-1&&next.y==m-1){ cout<<next.step<<endl; count++; ok=1; break; } else{ vis[next.x][next.y]=1; q.push(next); count++; } } } if(ok)break; } if(count==0) cout<<0<<endl; } return 0; }