题目描述Description
Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草。可惜天不从人愿,他在植物大战人类中败下阵来。邪恶的乳草已经在他的农场的西北部份佔领了一片立足之地。
草地像往常一样,被分割成一个高度為Y(1 <= y <= 100), 宽度為X(1 <= x <= 100)的直角网格。(1,1)是左下角的格(也就是说坐标排布跟一般的X,Y坐标相同)。乳草一开始佔领了格(Mx,My)。每个星期,乳草传播到已被乳草佔领的格子四面八方的每一个没有很多石头的格(包括垂直与水平相邻的和对角线上相邻的格)。1周之后,这些新佔领的格又可以把乳草传播到更多的格裡面了。
Bessie想要在草地被乳草完全佔领之前尽可能的享用所有的牧草。她很好奇到底乳草要多久才能佔领整个草地。如果乳草在0时刻处於格(Mx,My),那麼还在那个时刻它们可以完全佔领入侵整片草地呢(对给定的数据总是会发生)?
草地由一个图片表示。”.”表示草,而”*”表示大石。比如这个X=4, Y=3的例子。
....
..*.
.**.
如果乳草一开始在左下角(第1排,第1列),那麼草地的地图将会以如下态势发展:
.... .... MMM. MMMM MMMM
..*. MM*. MM*. MM*M MM*M
M**. M**. M**. M**. M**M
星期数 0 1 2 3 4
乳草会在4星期后佔领整片土地。
输入描述 Input Description
第一行: 四个由空格隔开的整数: X, Y, Mx, My
第2到第Y+1行: 数据的第y+1行由X个字符(”.”表示草地,”*”表示大石),描述草地的
第(Y+2-y)行。
输出描述 Output Description
- 第一行: 一个单独的整数表示最后一个不是大石块的格子被乳草佔领的星期数。
【测试样例1】
输入Input
4 3 1 1
….
..*.
.**.
输出Output
4
典型而正常的宽搜题(蒟蒻我只能发这种题解了QAQ)
(mdzz编辑器,打好的题解没保存就自己关了*2,神TM不想打字了QAQ)
代码:
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
const int maxn = 111;
using namespace std;
string sth;
int n,m,mx,my;
const int xx[]={1,-1,0,0,1,1,-1,-1};
const int yy[]={0,0,1,-1,1,-1,1,-1};
bool map[maxn][maxn];
struct meiko
{
int x;
int y;
int step;
}q[23333];
bool inside(int x,int y)
{
if(map[x][y] ||x < 1||x > m||y < 1||y > n)
return 0;
map[x][y] = 1;
return 1;
}
int bfs(int xxx, int yyy)
{
int faq = 0,qwq = 1;
int nowx,nowy;
q[0].x = xxx;
q[0].y = yyy;
map[xxx][yyy] = 1;
while(faq<qwq)
{
for(int i=0;i<8;i++)
{
nowx = q[faq].x + xx[i];
nowy = q[faq].y + yy[i];
if(inside(nowx,nowy))
{
q[qwq].x = nowx;
q[qwq].y = nowy;
q[qwq].step = q[faq].step+1;
qwq++;
}
}
faq++;
}
printf("%d\n",q[qwq-1].step);
}
int main()
{
scanf("%d%d%d%d",&n,&m,&mx,&my);
for(int i = m;i > 0;i--)
{
cin>>sth;
for(int j = 0;j < n;j++)
{
if(sth[j] == '*')
map[i][j+1] = 1;
}
}
bfs(my,mx);
return 0;
}
(代码该是相当朴素…但这魂淡代码片配色也是醉了~)