T4870 水灾(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!!!”。

输入输出格式

输入格式:

3 3
D.*


.S.

输出格式:

3

输入输出样例

输入样例#1:

3 3
D.*
…
..S

输出样例#1:

ORZ hzwer!!!

输入样例#2:

3 6
D…*.
.X.X..
….S.

输出样例#2:

6

很简单的广搜问题,按照题目的要求模拟即可
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<queue>
  6 using namespace std;
  7 int n,m;
  8 int xx[7]={-1,+1,0,0};
  9 int yy[7]={0,0,-1,+1};
 10 struct peo
 11 {
 12     int juli;//
 13     int x,y;
 14     int step;
 15 }now,nxt;
 16 int map[201][201];
 17 int bgx,bgy,homex,homey;
 18 int vis[201][201];// 被洪水淹没的地方,注意要map和vis同时判断
 19 int ans=438438;
 20 int watercishu=1;
 21 int flag=0;
 22 int vis2[201][201];
 23 int calca(int xxx,int yyy)
 24 {
 25     return max(xxx,homex)-min(xxx,homex)+max(yyy,homey)-min(yyy,homey);
 26 }
 27 void init()
 28 {
 29     scanf("%d%d",&n,&m);
 30     for(int i=1;i<=n;i++)
 31         for(int j=1;j<=m;j++)
 32         {
 33             char p;
 34             cin>>p;
 35             if(p==‘.‘)
 36             map[i][j]=0;// 都可以通过
 37             else if(p==‘X‘)
 38             map[i][j]=1;// 都不可以通过
 39             else if(p==‘S‘)
 40             {map[i][j]=2;//人现在的位置
 41             bgx=i;bgy=j;}
 42             else if(p==‘*‘)
 43             map[i][j]=3,vis[i][j]=1;// 洪水开始的地方
 44             else if(p==‘D‘)
 45             {
 46                 map[i][j]=4;// 家
 47                 homex=i;
 48                 homey=j;
 49             }
 50
 51         }
 52 }
 53 void ex()
 54 {
 55     int flag=0;
 56     for(int i=1;i<=n;i++)
 57     {
 58         for(int j=1;j<=m;j++)
 59         {
 60             if(vis[i][j]==watercishu)
 61             {
 62                 for(int k=0;k<4;k++)
 63                 {
 64                     int wx=i+xx[k];
 65                     int wy=j+yy[k];
 66                     if(vis[wx][wy]==0&&map[wx][wy]!=1&&map[wx][wy]!=4&&wx>=1&&wx<=n&&wy>=1&&wy<=m)
 67                     {
 68                         vis[wx][wy]=vis[i][j]+1;
 69                     }
 70                 }
 71             }
 72         }
 73     }
 74     watercishu++;
 75 }
 76 void bfs()
 77 {
 78     queue<peo>q;
 79     now.x=bgx;now.y=bgy;now.step=0;now.juli=calca(bgx,bgy);
 80     q.push(now);
 81     int last=0;// 记录上一次洪水扩展时人走的步数
 82     while(q.size()!=0)
 83     {
 84         peo p=q.front();
 85         if(vis[p.x][p.y]!=0)
 86         {
 87             q.pop();
 88             continue;
 89         }
 90         if(p.juli==0)
 91         {
 92             printf("%d",p.step);
 93             flag=1;
 94             return ;
 95         }
 96
 97         q.pop();
 98         if(p.step>last)
 99         {
100             ex();// 洪水扩展
101             last=p.step;
102         }
103         if(vis[p.x][p.y]!=0)
104         {
105             continue;
106         }
107         for(int i=0;i<4;i++)
108         {
109             int wx=p.x+xx[i];
110             int wy=p.y+yy[i];
111             if(vis2[wx][wy]==0&&vis[wx][wy]==0&&map[wx][wy]!=1&&wx>=1&&wx<=n&&wy>=1&&wy<=m)
112             {
113                 vis2[wx][wy]=1;
114                 nxt.x=wx;
115                 nxt.y=wy;
116                 nxt.step=p.step+1;
117                 nxt.juli=calca(wx,wy);
118                 q.push(nxt);
119             }
120         }
121
122     }
123 }
124 int main()
125 {
126 ///    freopen("sliker.in","r",stdin);
127 //    freopen("sliker.out","w",stdout);
128     init();
129     bfs();
130     if(flag==0)
131         printf("ORZ hzwer!!!");
132     return 0;
133 }
				
时间: 2024-08-06 20:41:19

T4870 水灾(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的别墅."

T4869 某种数列问题 (jx.cpp/c/pas) 1000MS 256MB

题目描述 众所周知,chenzeyu97有无数的妹子(阿掉!>_<),而且他还有很多恶趣味的问题,继上次纠结于一排妹子的排法以后,今天他有非(chi)常(bao)认(cheng)真(zhe)去研究一个奇怪的问题.有一堆他的妹子站成一排,然后对于每个妹子有一个美丽度,当然美丽度越大越好,chenzeyu97妹子很多,但是质量上不容乐观,经常出现很多美丽度为负数的妹子(喜闻乐见),chenzeyu97希望从一排妹子里找出3队连续的妹子,使她们的美丽度和最大.注意,一个妹子不能被编入多个队伍而且一定

水灾 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每分

灵渊(seals.cpp/c/pas)

题意:p(m)的值为m的正因数个数(包括1和m本身). 求满足p(x)=n的x的最小值. 对于任意正整数n,有n=p1^a1 * p2^a2 * p3^a3 * …… * pn^an;(pi为质数)n的因数个数(a1+1)*(a2+1)*(a3+1)*……*(an+1); 举个例子,8=2*2*2:可以这样 2^1 * 3^1 * 5^1 =30;因为 8也可分解为这种形式: 8=2*4:2^3 * 3^1 =24; 正确答案为 24 . 假设 有一个数 n=b1*b2*b3*……*bi*……*

洛谷 P2071 座位安排 seat.cpp/c/pas

P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最多使多少人坐到自己想坐的位置. 输入输出格式 输入格式: 第一行,一个正整数N. 第二行至第N*2+1行,每行两个正整数Si1,Si2,为每个人想坐的排数. 输出格式: 一个非负整数,为最多使得多少人满意. 输入输出样例 输入样例#1: 复制 4

【二分图】【最大匹配】【匈牙利算法】洛谷 P2071 座位安排 seat.cpp/c/pas

∵每个座位可以坐俩人,所以拆点最大匹配. 1 #include<cstdio> 2 #include<vector> 3 #include<cstring> 4 using namespace std; 5 #define N 2001 6 vector<int>G[N<<2]; 7 typedef vector<int>::iterator ITER; 8 int mat[N<<2]; 9 bool vis[N<&

[noip模拟]水灾&lt;BFS&gt;

水灾(sliker.cpp/c/pas) 1000MS  64MB 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没. CCY所在的城市可以用一个N*M(N,M<=50)的地图表示,地图上有五种符号:“. * X D S”.其中“X”表示石头,水和人都不能从上面经过.“.”表示平原,CCY和洪水都可以经过.“*”表示洪水开始地方(可能有多个地方开始发生洪水).“D”表示CCY的别墅.“S”表示CCY现在的位置. CCY每分

5.20 考试 20 未完

水灾(sliker.cpp/c/pas) 1000MS  64MB 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没. CCY所在的城市可以用一个N*M(N,M<=50)的地图表示,地图上有五种符号:". * X D S".其中"X"表示石头,水和人都不能从上面经过."."表示平原,CCY和洪水都可以经过."*"表示洪水开始地方(可能有多个地方开始

欢乐赛解题报告

~~一场不欢乐的欢乐赛 时间分配::T1做的时候还可以,大约三十分钟写了个深搜(鬼知道我为啥不用广搜,大概是因为快半个月没写了)写完后去研究第二题,刚开始以为是贪心,很快写了出来,但是自己推了一会举出了反例.于是自己想了很多方法,但是都是基于贪心,写了一个多小时,写炸了,没办法又改成了贪心.第三题并不会,然后搜索大法过了一个点,(输出-1也是一个点) 整体感觉::还是太弱,T1是会的,但是还是没做对,大概是独立做题少的缘故吧,平常做题都没有思考太多时间.T2贪心T3暴力,貌似自己啥都不会.到现在