仙岛求药

Posted peppa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仙岛求药相关的知识,希望对你有一定的参考价值。

我真菜,真的。

我不仅很菜,而且很矬;

所以写这篇题解的目的是想证明我很菜;

但怎么证明我很矬呢;

只要去我们班的群相册里看一下;

就会发现,我是众多小姑娘中最矬的那一个;

这道题在大家都轻松A掉的时候,我还一直WA;

我又菜又矬,真的。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 char s[23][23];
 8 int st[23][23];
 9 int i,j,m,n,sx,sy,tx,ty,ans = 0;
10 void bfs(int sx,int sy)
11 {
12     int t = st[sx][sy];
13     if(sx == tx && sy == ty)
14         ans = t;
15     t++;
16     if(sx + 1 < m && s[sx+1][sy] != # && st[sx+1][sy] > t)
17     {
18         st[sx + 1][sy] = t;
19         bfs(sx+1,sy);
20     }
21     if(sx - 1 >= 0 && s[sx-1][sy] != # && st[sx-1][sy] > t)
22     {
23         st[sx - 1][sy] = t;
24         bfs(sx-1,sy);
25     }
26     if(sy + 1 < n && s[sx][sy+1] != # && st[sx][sy+1] > t)
27     {
28         st[sx][sy+1] = t;
29         bfs(sx,sy+1);
30     }
31     if(sy-1 >= 0 && s[sx][sy-1] != # && st[sx][sy-1] > t)
32     {
33         st[sx][sy-1] = t;
34         bfs(sx,sy-1);
35     }
36 }
37 int main()
38 {
39     while(scanf("%d%d",&m,&n) != EOF)
40     {
41         if(m == 0 && n == 0) break;
42         for(i = 0;i < m;i++)
43             for(j = 0;j < n;j++)
44             {
45                 cin >> s[i][j];
46                 if(s[i][j] == @)
47                 {
48                     sx = i;
49                     sy = j;
50                 }
51                 if(s[i][j] == *)
52                 {
53                     tx = i;
54                     ty = j;
55                 }
56             }
57         memset(st,0x7f,sizeof(st));
58         st[sx][sy] = 0;
59         bfs(sx,sy);
60         if(ans != 0) printf("%d
",ans);
61         else printf("-1
");
62         ans = 0;
63     }
64     return 0;
65 }

这道题用广搜(深搜会T(吧)),然后思路是比当前解优就更新。

 

以上是关于仙岛求药的主要内容,如果未能解决你的问题,请参考以下文章

AC日记——仙岛求药 openjude 2727

仙岛求药

2727:仙岛求药(广搜)

2727:仙岛求药

openjudge 2727:仙岛求药

仙岛求药