题目描述
农民约翰一直努力让他的草地充满鲜美多汁而又健康的牧草。
可惜天不从人愿,他在植物大战人类中败下阵来。
邪恶的乳草已经在他的农场的西北部份占领了一片立足之地。
草地像往常一样,被分割成一个高度为Y, 宽度为X的直角网格。
(1,1)是左下角的格(也就是说坐标排布跟一般的X,Y坐标相同)。
乳草一开始占领了格(Mx,My)。
每个星期,乳草传播到已被乳草占领的格子四面八方的每一个没有很多石头的格
(包括垂直与水平相邻的和对角线上相邻的格)内。
1周之后,这些新占领的格又可以把乳草传播到更多的格里面了。
达达想要在草地被乳草完全占领之前尽可能的享用所有的牧草。
她很好奇到底乳草要多久才能占领整个草地。
如果乳草在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星期后占领整片土地。
输入格式
第1行: 四个由空格隔开的整数: X, Y, Mx, My
第2到第Y+1行: 每行包含一个由X个字符(”.”表示草地,”*”表示大石)构成的字符串,共同描绘了草地的完整地图。
输出格式
输出一个整数,表示乳草完全占领草地所需要的星期数。
数据范围
1≤X,Y≤100
输入样例:
4 3 1 1
....
..*.
.**.
输出样例:
4
算法1
读入有毒 XY要转换下
其他没什么了
BFS 以队列Q为空作为退出时机,其实不太需要进行计数cnt 。
标记是否访问数组 其实可以检查数组元素是 . M * 就可以了
C++ 代码
// 123124.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
/*
输入样例:
4 3 1 1
....
..*.
.**.
输出样例:
4
*/
const int N = 110;
int n, m, inx, iny;
char g[N][N];
int dir[8][2] = {
{-1,-1},{-1,0},{-1,1},
{0,-1},{0,1},
{1,-1},{1,0},{1,1}
};
int main()
{
cin >> n >> m >> inx >> iny;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> g[i][j];
}
}
//x y 调转
int startx = m-iny;
int starty = inx -1;
int ans = 0;
queue<vector<int>> Q;
Q.push({ startx ,starty,0 });
g[startx][starty] = 'M';
while (Q.size()) {
int x = Q.front()[0];
int y = Q.front()[1];
int day = Q.front()[2];
ans = day;
Q.pop();
for (int i = 0; i < 8; i++) {
int newx = x + dir[i][0];
int newy = y + dir[i][1];
if (newx >= 0 && newx < m && newy >= 0 && newy < n && g[newx][newy] == '.') {
g[newx][newy] = 'M';
Q.push({ newx ,newy,day+1});
}
}
}
cout << ans << endl;
return 0;
}
我没理解错的话n表示列,m表示行,然后,题目里定义的起始位置是从下向上看的也就是左下角1,1 但是他本来坐标应该是 2,0
所以从输入坐标转化为正常坐标,需要一个变换,即初始行为m-inx 初始列为n-1,,,但是我发现你写的和我的思路感觉一样,但是好像是反的,求大佬指教
xy 如何 映射 ,是行还是列。这个看自己把握。
就像数组有时候下索引从1开始 有时候从0开始,自己把握好就好