3 3 D.* ... .S.
3
#include<stdio.h> #include<string.h> char a[55][55],b[55][55],flag=1; int xa[4]={-1,1,0,0}; int ya[4]={0,0,-1,1}; int main() { int sum,i,j,k,ex,ey,judge,ji=0,n,m,he; memset(a,'0',sizeof(a)); while(scanf("%d %d",&n,&m)!=EOF) { memset(a,'0',sizeof(a)); //对数组初始化 memset(b,'0',sizeof(b)); he=0; sum=0; getchar(); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%c",&a[i][j]); b[i][j]=a[i][j]; if(a[i][j]=='D'){ex=i;ey=j;} //记录终点的位置 } getchar(); } flag=1; for(i=0;i<4;i++) { if(a[ex+xa[i]][ey+ya[i]]!='0')he++; //判断结果不成立应该考虑几个位置 if(a[ex+xa[i]][ey+ya[i]]=='S'){flag=0;sum++;break;} //判断D的旁边是否存在S,存在的直接输出1 } if(flag==0){printf("%d\n,sum");continue;} while(flag) { ji=0; for(i=0;i<4;i++) //判断终点是否被障碍和洪水全部覆盖 如是则不能到达目的地 { if(a[ex+xa[i]][ey+ya[i]]=='X'||a[ex+xa[i]][ey+ya[i]]=='*')ji++; } if(ji==he)break; if(flag==0)break; for(i=1;i<=n;i++) //将S的范围进行扩展 for(j=1;j<=m;j++) if(a[i][j]=='S'){ for(k=0;k<4;k++) { int x=i+xa[k]; int y=j+ya[k]; if(a[x][y]=='D'){flag=0;break;} if(x>=1&&x<=n&&y>=1&&y<=m&&a[x][y]!='*'&&a[x][y]!='X') {b[x][y]='S';} //将数据保存到b数组中 } } sum++; //步数+1 if(flag==0)continue; for(i=1;i<=n;i++) //对洪水流到的位置进行扩展 for(j=1;j<=m;j++) { if(a[i][j]=='*'){ for(k=0;k<4;k++) { int x=i+xa[k]; int y=j+ya[k]; if(x>=1&&x<=n&&y>=1&&y<=m&&a[x][y]!='D'&&a[x][y]!='X') { b[x][y]='*'; } } } } for(i=1;i<=n;i++) //将b数组中的数据拷贝给a数组。 for(j=1;j<=m;j++) a[i][j]=b[i][j]; } if(ji==he) {printf("KAKTUS\n");continue;} if(flag==0){printf("%d\n",sum); } } }