1252:走迷宫
1252:走迷宫时间限制: 1000 ms 内存限制: 65536 KB 提交数: 3548 通过数: 1520 【题目描述】一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。 SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。【输入】第一行是两个整数,R和C,代表迷宫的长和宽。( 1≤ R,C ≤ 40) 接下来是R行,每行C个字符,代表整个迷宫。 空地格子用‘.’表示,有障碍物的格子用‘#’表示。 迷宫左上角和右下角都是‘.’。
【输出】输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。 【输入样例】5 5 ..### #.... #.#.# #.#.# #.#.. 【输出样例】9 【来源】 |
思路:
1.dfs,结果超时 30分
1 #include<iostream> //30分代码 2 #include<cstdio> 3 using namespace std; 4 int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; 5 int n,m,sx,sy,ex,ey,minn=9999999;char a[500][500]; 6 bool book[500][500]; 7 int i,j; 8 void dfs(int x,int y,int step) 9 { 10 int nx,ny,k; 11 if(x==n&&y==m) 12 { 13 if(step<minn) 14 minn=step; 15 return; 16 } 17 for(k=0;k<=3;k++) 18 { 19 nx=x+next[k][0]; 20 ny=y+next[k][1]; 21 if(nx<1||nx>n||ny<1||ny>m) 22 continue; 23 if(a[nx][ny]=='.'&&book[nx][ny]==0) 24 { 25 book[nx][ny]=1; 26 dfs(nx,ny,step+1); 27 book[nx][ny]=0; 28 } 29 } 30 return; 31 } 32 int main() 33 { 34 scanf("%d%d",&n,&m); 35 for(i=1;i<=n;i++) 36 for(j=1;j<=m;j++) 37 { 38 cin>>a[i][j]; 39 } 40 book[sx][sy]=1; 41 dfs(1,1,0); 42 printf("%d",minn+1); 43 return 0; 44 }
2.dfs 100分
1 #include<cstdio> 2 #include<iostream> 3 #include<queue> 4 using namespace std; 5 int next[4][2]={{1,0},{-1,0},{0,-1},{0,1}}; 6 char s[50][50]; 7 int n,m,ans,minn=999999; 8 int i,j; 9 struct node{ 10 int x,y,step; 11 }; 12 void bfs(int a,int b) 13 { 14 queue<node>q;int k; 15 s[0][0]='.'; 16 node q1; 17 q1.x=a; 18 q1.y=b; 19 q1.step=0; 20 q.push(q1); 21 while(!q.empty()) 22 { 23 node q2=q.front(); 24 for(k=0;k<4;k++) 25 { 26 int xx=q2.x+next[k][0]; 27 int yy=q2.y+next[k][1]; 28 if(xx>=0&&xx<n&&yy>=0&&yy<m&&s[xx][yy]=='.') 29 { 30 s[xx][yy]='#'; 31 node q3; 32 q3.x=xx;q3.y=yy;q3.step=(q2.step+1); 33 if(xx==n-1&&yy==m-1) 34 { 35 if(q3.step<minn) 36 minn=q3.step; 37 } 38 else 39 q.push(q3); 40 } 41 } 42 q.pop(); 43 } 44 } 45 int main() 46 { 47 scanf("%d%d",&n,&m); 48 for(i=0;i<n;i++) 49 scanf("%s",s[i]); 50 bfs(0,0); 51 printf("%d",minn+1); //注意加一 52 return 0; 53 }

更多精彩