迷宫问题

题目描述

小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。
小明只能向上下左右四个方向移动。

输入

输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是两个整数N和M(1<=N,M<=100)。
接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
字符的含义如下:
‘S’:起点
‘E’:终点
‘-’:空地,可以通过
‘#’:障碍,无法通过
输入数据保证有且仅有一个起点和终点。

输出

对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。

样例输入

1
5 5
S-###
-----
##---
E#---
---##

样例输出

9
题意描述:
输入地图的大小以及地图的样貌(包括起始和终点坐标)
计算并输出从起始坐标走到终点左标的最少步数。
解题思路:
用广度优先搜索计算图中两点间的最短路径。
代码实现:
 1 #include<stdio.h>
 2 #include<string.h>
 3 struct note
 4 {
 5     int x,y,s;
 6 };
 7 int main()
 8 {
 9     struct note que[10010];
10     char a[110][110];
11     int book[110][110];
12     int next[4][2]={0,1,1,0,0,-1,-1,0};
13     int head,tail,T,i,j,k,n,m,sx,sy,ex,ey,tx,ty,flag;
14     
15     scanf("%d",&T);
16     while(T--)
17     {
18         scanf("%d%d",&n,&m);
19         getchar();//吃掉换行 
20         for(i=1;i<=n;i++){
21             for(j=1;j<=m;j++){
22                 scanf("%c",&a[i][j]);
23                 if(a[i][j]=='S')
24                 {
25                     sx=i;
26                     sy=j;
27                     a[i][j]='-';//更改成可行路径 
28                 }
29                 if(a[i][j]=='E')
30                 {
31                     ex=i;
32                     ey=j;
33                     a[i][j]='-';
34                 }
35             }
36             getchar();
37         }
38 
39         head=1;
40         tail=1;
41         que[tail].x=sx;
42         que[tail].y=sy;
43         que[tail].s=0;
44         tail++;
45         
46         memset(book,0,sizeof(book));//初始化 
47         book[sx][sy]=1;
48         flag=0;
49         while(head<tail)
50         {
51             for(k=0;k<=3;k++)
52             {
53                 tx=que[head].x+next[k][0];
54                 ty=que[head].y+next[k][1];
55                 if(tx<1 || tx>n ||ty<1 ||ty>m)
56                     continue;
57                 if(a[tx][ty]=='-' && book[tx][ty]==0)
58                 {
59                     book[tx][ty]=1;
60                     que[tail].x=tx;
61                     que[tail].y=ty;
62                     que[tail].s=que[head].s+1;
63                     tail++;
64                 } 
65                  if(tx==ex && ty==ey)
66                  {
67                      flag=1;
68                      break;
69                  }
70             }
71             if(flag)
72                 break;
73             head++;
74         }
75         if(flag)
76         printf("%d\n",que[tail-1].s);
77         else
78         printf("-1\n");
79     }
80     return 0;
81 } 

易错分析:
1、刚开始输入地图的时候总是输入不对,后来发现输入字符串的时候忘记吃掉换行,浪费了不少时间。

2、标记数组book没有初始化

3、没有考虑当没有可最短路径时输出-1

测试样例:

3

4 4

--S-

####

----

##E-

4 4

----

S---

#-E-

##--

4 4

S###

-#--

---E

#---

样例输出:

-1

3

5

 

posted @ 2017-07-23 16:33  Reqaw  阅读(360)  评论(0编辑  收藏  举报