2.5-2727:仙岛求药
Posted 木樨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.5-2727:仙岛求药相关的知识,希望对你有一定的参考价值。
描述少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。
下图 显示了一个迷阵的样例及李逍遥找到仙药的路线.
输入输入有多组测试数据. 每组测试数据以两个非零整数 M 和 N 开始,两者均不大于20。M 表示迷阵行数, N 表示迷阵列数。接下来有 M 行, 每行包含N个字符,不同字符分别代表不同含义:
1) ‘@’:少年李逍遥所在的位置;
2) ‘.’:可以安全通行的方格;
3) ‘#’:有怪物的方格;
4) ‘*’:仙药所在位置。
当在一行中读入的是两个零时,表示输入结束。
输出对于每组测试数据,分别输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1。样例输入
8 8 [email protected]##...# #....#.# #.#.##.. ..#.###. #.#...#. ..###.#. ...#.*.. .#...### 6 5 .*.#. .#... ..##. ..... .#... [email protected] 9 6 .#..#. .#.*.# .####. ..#... ..#... ..#... ..#... #[email protected]## .#..#. 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:仙岛求药的主要内容,如果未能解决你的问题,请参考以下文章