首页 > 代码库 > 2.5-2727:仙岛求药

2.5-2727:仙岛求药

描述少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。
下图 显示了一个迷阵的样例及李逍遥找到仙药的路线.
技术分享
输入输入有多组测试数据. 每组测试数据以两个非零整数 M 和 N 开始,两者均不大于20。M 表示迷阵行数, N 表示迷阵列数。接下来有 M 行, 每行包含N个字符,不同字符分别代表不同含义: 
1) ‘@’:少年李逍遥所在的位置;
2) ‘.’:可以安全通行的方格;
3) ‘#’:有怪物的方格;
4) ‘*’:仙药所在位置。
当在一行中读入的是两个零时,表示输入结束。
输出对于每组测试数据,分别输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1。样例输入

8 8
.@##...#
#....#.#
#.#.##..
..#.###.
#.#...#.
..###.#.
...#.*..
.#...###
6 5
.*.#.
.#...
..##.
.....
.#...
....@
9 6
.#..#. 
.#.*.# 
.####. 
..#... 
..#... 
..#... 
..#... 
#.@.## 
.#..#. 
0 0

样例输出

10
8
-1
 1 #include<stdio.h>
 2 #include<string.h>
 3 int ni[4]={0,1,0,-1};
 4 int nj[4]={1,0,-1,0};
 5 int qu[401][2],dep[500];
 6 char a[21][21];
 7 int book[21][21];
 8 int m,n,i,j,k,si,sj,xi,xj,qi,qj,zi,zj,bu=0,ans;
 9 int main()
10 {
11 /*    FILE *fin,*fout;
12     fin=fopen("map.in","r");
13     fout=fopen("answer.out","w");
14 */    int star,s;
15 //    fscanf(fin,"%d%d",&m,&n);
16     scanf("%d%d",&m,&n);
17     while(m!=0&&n!=0)
18     {
19         memset(book,0,sizeof(book));
20         for(i=1;i<=m;i++)
21             //fscanf(fin,"%s",a[i]);
22             scanf("%s",a[i]);
23         for(i=1;i<=m;i++)
24             for(j=0;j<=n-1;j++)
25             {
26                 if(a[i][j]==@)    {qi=i;qj=j;book[i][j]=1;}
27                 if(a[i][j]==*)    {zi=i;zj=j;}
28             }
29         star=0;s=0;ans=-1;
30         memset(dep,0,sizeof(dep));
31         memset(qu,0,sizeof(qu));
32         qu[0][0]=qi;qu[0][1]=qj;
33         while(star<=s)
34         {
35             xi=qu[star][0];
36             xj=qu[star][1];
37             if(xi==zi&&xj==zj)
38             {
39                 ans=dep[star];
40                 break;
41             }
42             for(k=0;k<=3;k++)
43             {
44                 si=xi+ni[k];
45                 sj=xj+nj[k];
46                 if(si>=1&&si<=m&&sj>=0&&sj<=n-1)
47                     if(a[si][sj]!=#&&book[si][sj]!=1)
48                     {
49                         qu[++s][0]=si;
50                         qu[s][1]=sj;
51                         dep[s]=dep[star]+1;
52                         book[si][sj]=1;
53                     }
54             }
55             star++;
56         }
57         //fprintf(fout,"%d\n",ans);
58         printf("%d\n",ans);
59         //fscanf(fin,"%d%d",&m,&n);
60         scanf("%d%d",&m,&n);
61     }
62 /*    fclose(fin);
63     fclose(fout);
64 */    return 0;
65 }

 

2.5-2727:仙岛求药