1.冬冬走迷宫
time limit:1s
memory limit:128 MB
众所周知,冬冬是一个土豪以及游戏狂热玩家。最近他趁着暑假,买了许多游戏来消遣。可是当他把所有游戏都通关了以后,感到无敌是多么寂寞,必须靠经典才能满足他。于是他又玩起了走迷宫的小游戏。
走迷宫可以简化为一个矩阵,里面含n*m个格子。有些格子是可以进入并且通过的,有些格子内含障碍物,是不能进入通过它的。我们的任务就是在给定一个起点S和一个终点T后,选择一个不经过障碍物以及走出矩阵边界的方案,把自己控制的角色从S走到T。
然而冬冬身经百战,不知道比其他人高到哪里去了,因此他总会选择最短的路径来走完这个迷宫。可是他不能确定自己的路径是不是最短的,因此他希望你能帮助他,给出每个迷宫的最短路径长度(即从S到T经过(包含S和T)的格子数)。
作为新晋ACMer,你能帮助冬冬完成这个任务吗?
Input
多组数据输入,保证格子总数不超过100w。
第一行是两个正整数n,m,代表矩阵的高度和宽度。其中0≤n,m≤100.
接下来n行m列,给出迷宫每个格子的情况。'S'代表起点,'T'代表终点,'#'代表障碍物,'.'代表可通行区域。
Output
对于每组数据,输出一行从S到T的最短路径的长度。若无从S到T的路径,则输出“Impossible”。
Sample Input
5 6
S.....
#.###.
##.T..
#.###.
#.....
2 9
S.#......
###T####.
Sample Output
10
Impossible


 一道很基础的bfs题,除了迷宫的地图数组外,加入标记数组,步数数组,bfs时让每个格子向四周扩展,把没有标记的格子以及他的步数加入队列中并标记他们,还需在步数数组上记录到该点的步数,直至队列中没有元素为止(或者bfs到T点就跳出循环)。最后检查下终点T有无被标记过。没有则是Impossible,有则输出T点的步数。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<queue>
 5 #define clr_1(x) memset(x,-1,sizeof(x))
 6 #define clr(x) memset(x,0,sizeof(x))
 7 using namespace std;
 8 struct node
 9 {
10     int x,y,step;
11 }u,v;
12 queue<node> que;
13 char s[200]; 
14 int map[200][200];
15 int stepm[200][200];
16 int dirx[4]={0,0,-1,1},diry[4]={1,-1,0,0};
17 int n,m,t,k,sx,sy,tx,ty;
18 void init()
19 {
20     clr(map);
21     for(int i=1;i<=n;i++)
22     {
23         scanf("%s",s);
24         for(int j=0;j<strlen(s);j++)
25         {
26             if(s[j]=='S')
27             {
28                 sx=i;
29                 sy=j+1;    
30                 map[i][j+1]=1;
31             }    
32             if(s[j]=='T')
33             {
34                 tx=i;
35                 ty=j+1;
36                 map[i][j+1]=1;                        
37             }
38             if(s[j]=='.')
39             {
40                 map[i][j+1]=1;                        
41             }
42         } 
43     } 
44     while(!que.empty())
45         que.pop();
46     return ;
47 }
48 void bfs()
49 {
50     while(!que.empty())
51     {
52         u=que.front();
53         que.pop();
54         for(int i=0;i<4;i++)
55         {
56             v=u;
57             v.x+=dirx[i];
58             v.y+=diry[i];
59             v.step++;
60             if(map[v.x][v.y]==1)
61             {
62                 map[v.x][v.y]=0;
63                 stepm[v.x][v.y]=v.step;
64                 que.push(v);
65             }
66         }
67         
68     }
69     return ;
70 }
71 int main()
72 {
73     freopen("1.in","r",stdin);
74     freopen("1.out","w",stdout);
75     while(scanf("%d%d",&n,&m)!=EOF)
76     {
77         init();
78         u.x=sx;
79         u.y=sy;
80         u.step=1;
81         map[sx][sy]=0;
82         que.push(u);
83         bfs();
84         if(map[tx][ty]==1)
85         {
86             printf("Impossible\n");
87         }
88         else
89         {
90             printf("%d\n",stepm[tx][ty]);
91         }
92     }
93     return 0;        
94 } 
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-08-13
  • 2021-12-22
  • 2022-12-23
  • 2021-12-21
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-09
  • 2022-02-03
  • 2022-02-12
相关资源
相似解决方案