F-SLIKAR
Time Limit : 3000/2000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 137 Accepted Submission(s) : 52
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
在一块R×C的矩形土地上,某天发起了洪水。洪水即将把整片土地淹没,于是Beaver不得不用最快的速度赶回老家,因为那里地势高,可以安全地避难。
在地图上,用“.”表示空地,用“D”表示老家的位置,用“S”表示Beaver当前的位置,用“X”表示巨大的岩石,用“*”表示被洪水淹没的地区。每一个单位时间,Beaver可以向上下左右四个方向移动一格,同样在已经有洪水的地区,洪水也能沿四个方向往外扩展一格。所有的岩石以及Beaver的老家都不会被水淹没,Beaver也无法通过岩石阻碍的地方。任何一个时刻,都要保证Beaver不在洪水覆盖的区域。
现在请写一个程序,告诉Beaver最快要多少时间可以安全到达老家。
Input
第一行给出两个正整数R和C,均不超过50。
接下来R行,每行包含C个字符,描述了整个地图。其中“D”和“S”有且仅有一个。
Output
输出所需要的最短时间,使Beaver可以安全到达老家。如果不存在这样的路,就输出“KAKTUS”。
Sample Input
Sample Output
Author
hnfnu
算法:
一眼看上去就是搜索问题,但是自己却没有用到搜索的解法,直接填表得到的数据。
这个比较汗~~~
举个例子来讲
对于 sample 来讲
1 先对S进行扩展 然后再对* 进行扩展 步骤数+1
2 *的扩展会覆盖 S的值
3 当S 只要在D点的上下左右 即可停止扩展 输出结果+1
4 当D点全被*或X覆盖后 则S不能到达D点 则说明结果不存在,注意D点在边界的情况,会造成仅会考虑到在map中的几个方向(如sample 仅考虑2个方向即可)。
post code:
#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); }
}
}