1252:走迷宫


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 3548     通过数: 1520 

【题目描述】

一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。

给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

【输入】

第一行是两个整数,R和C,代表迷宫的长和宽。( 1≤ R,C ≤ 40)

接下来是R行,每行C个字符,代表整个迷宫。

空地格子用‘.’表示,有障碍物的格子用‘#’表示。

迷宫左上角和右下角都是‘.’。

 

【输出】

输出从左上角走到右下角至少要经过多少步(即至少要经过多少个空地格子)。计算步数要包括起点和终点。

【输入样例】

5 5
..###
#....
#.#.#
#.#.#
#.#..

【输出样例】

9

【来源】

一本通:http://ybt.ssoier.cn:8088/problem_show.php?pid=1252

思路:

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 }

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄