Farmer John 一直努力让他的草地充满鲜美多汁的而又健康的牧草。可惜天不从人愿,他在植物大战人类中败下阵来。邪恶的乳草已经在他的农场的西北部份占领了一片立足之地。 草地像往常一样,被分割成一个高度为 Y(1 \le Y \le 100)Y(1≤Y≤100), 宽度为 X(1 \le X \le 100)X(1≤X≤100) 的直角网格。(1,1)(1,1)是左下角的格(也就是说坐标排布跟一般的 X,Y 坐标相同)。乳草一开始占领了格(M_x,M_y)(Mx,My)。
每个星期,乳草传播到已被乳草占领的格子四面八方的每一个没有很多石头的格(包括垂直与水平相邻的和对角线上相邻的格)。11 周之后,这些新占领的格又可以把乳草传播到更多的格里面了。 Bessie 想要在草地被乳草完全占领之前尽可能的享用所有的牧草。她很好奇到底乳草要多久才能占领整个草地。如果乳草在 00 时刻处于格 (M_x,M_y)(Mx,My),那么还在那个时刻它们可以完全占领入侵整片草地呢(对给定的数据总是会发生)? 草地由一个图片表示。'.'
表示草,而 '*'
表示大石。 比如这个 X=4, Y=3X=4,Y=3 的例子。
....
..*.
.**.
如果乳草一开始在左下角(第1排,第1列),那么草地的地图将会以如下态势发展:
第 00 周
....
..*.
M**.
第 11 周
....
MM*.
M**.
第 22 周
MMM.
MM*.
M**.
第 33 周
MMMM
MM*M
M**.
第 44 周
MMMM
MM*M
M**M
乳草会在4星期后占领整片土地。
输入格式
第一行: 四个由空格隔开的整数: X,Y,M_x,M_yX,Y,Mx,My
第 22 到第 Y+1Y+1 行: 数据的第 y+1y+1 行由 XX 个字符('.'
表示草地,'*'
表示大石),描述草地的第Y+2-yY+2−y 行。
输出格式
一个单独的整数表示最后一个不是大石块的格子被乳草占领的星期数。
样例输入
4 3 1 1 .... ..*. .**.
样例输出
4
/*
很简单的bfs, 但是题目语义给的不清楚
我还是很讨厌做这种横纵坐标不清楚的题的
*/
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 120;
int X, Y, Mx, My;
struct Node{
int r, c, step;
Node(int r, int c, int step):r(r), c(c), step(step){}
};
int dir[][2] = {
{0, 1},
{0, -1},
{1, 0},
{-1, 0},
{1, 1},
{1, -1},
{-1, 1},
{-1, -1}
};
char maze[maxn][maxn];
bool visited[maxn][maxn];
void bfs(int, int);
int step;
int main()
{
cin >> X >> Y >> Mx >> My;
for(int i = Y; i > 0; --i)
for(int j = 0; j < X;)
cin >> maze[i][++j];
/*for(int i = 1; i <= Y; ++i){
for(int j = 1; j <= X; ++j)
cout << " " << maze[i][j];
cout << endl;
}*/
bfs(My, Mx);// bfs(Mx, My)就错了, 但是我没从题目中发现语义的区别
cout << step << endl;
return 0;
}
void bfs(int r, int c)
{
queue<Node> Que;
visited[r][c] = true;
Que.push(Node(r, c, 0));
while(!Que.empty()){
const Node & cur = Que.front();
step = cur.step;// 这是第几步访问到的点, 最后一个节点是第几次访问, 就是答案
for(int i = 0; i < 8; ++i){
int nr = cur.r + dir[i][0];
int nc = cur.c + dir[i][1];
if(0 < nr && nr <= Y && 0 < nc && nc <= X)
if(maze[nr][nc] == '.' && !visited[nr][nc]){
visited[nr][nc] = true;
Que.push(Node(nr, nc, cur.step + 1));
}
}
Que.pop();
}
}