首页 > 代码库 > 水灾(sliker.cpp/c/pas) 1000MS 64MB
水灾(sliker.cpp/c/pas) 1000MS 64MB
大雨应经下了几天雨,却还是没有停的样子。土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没。
CCY所在的城市可以用一个N*M(N,M<=50)的地图表示,地图上有五种符号:“. * X D S”。其中“X”表示石头,水和人都不能从上面经过。“.”表示平原,CCY和洪水都可以经过。“*”表示洪水开始地方(可能有多个地方开始发生洪水)。“D”表示CCY的别墅。“S”表示CCY现在的位置。
CCY每分钟可以向相邻位置移动,而洪水将会在CCY移动之后把相邻的没有的土地淹没(从已淹没的土地)。
求CCY回到别墅的最少时间。如果聪哥回不了家,就很可能会被淹死,那么他就要膜拜黄金大神涨RP来呼叫直升飞机,所以输出“ORZ hzwer!!!”。
输入文件 sliker.in
输出文件 sliker.out
Input
3 3
D.*
…
.S.
Output
3
Input
3 3
D.*
…
..S
Output
ORZ hzwer!!!
Input
3 6
D…*.
.X.X..
….S.
Output
6
代碼實現:
人和水都是四方向移動。別墅的效果等於石頭,都可以攔截洪水。
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int n,m,qsl,qrl,zh,zl,a,b,c,nh,nl; 5 int qs[2][2600][2],qr[2][2600][2]; 6 int hb[]={0,0,1,-1},lb[]={1,-1,0,0}; 7 char ch; 8 int map[60][60],rj[60][60]; 9 int main(){ 10 scanf("%d%d",&n,&m); 11 for(int i=1;i<=n;i++) 12 for(int j=1;j<=m;j++){ 13 cin>>ch; 14 if(ch==‘X‘) map[i][j]=1; 15 if(ch==‘*‘){qs[0][qsl][0]=i;qs[0][qsl++][1]=j;map[i][j]=1;} 16 if(ch==‘S‘){qr[0][qrl][0]=i;qr[0][qrl++][1]=j;rj[i][j]=1;} 17 if(ch==‘D‘){zh=i;zl=j;map[i][j]=1;} 18 } 19 for(int ans=1;;ans++){ 20 if(!qrl) break; 21 b=(ans+1)%2;c=ans%2; 22 for(int i=0;i<qsl;i++){ 23 for(int j=0;j<4;j++){ 24 nh=qs[b][i][0]+hb[j];nl=qs[b][i][1]+lb[j]; 25 if(!map[nh][nl]&&nh>0&&nh<=n&&nl>0&&nl<=m){ 26 map[nh][nl]=1; 27 qs[c][a][0]=nh;qs[c][a++][1]=nl; 28 } 29 } 30 } 31 qsl=a;a=0; 32 for(int i=0;i<qrl;i++){ 33 for(int j=0;j<4;j++){ 34 nh=qr[b][i][0]+hb[j];nl=qr[b][i][1]+lb[j]; 35 if(nh==zh&&nl==zl){printf("%d\n",ans);return 0;} 36 if(!rj[nh][nl]&&!map[nh][nl]&&nh>0&&nh<=n&&nl>0&&nl<=m){ 37 rj[nh][nl]=1; 38 qr[c][a][0]=nh;qr[c][a++][1]=nl; 39 } 40 } 41 } 42 printf("\n"); 43 qrl=a;a=0; 44 } 45 printf("ORZ hzwer!!!\n"); 46 return 0; 47 }
這道題有數據坑,不按描述的來,得了90~
水灾(sliker.cpp/c/pas) 1000MS 64MB
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。