【bfs】乳草的侵占

农民约翰一直努力让他的草地充满鲜美多汁而又健康的牧草。
可惜天不从人愿,他在植物大战人类中败下阵来。
邪恶的乳草已经在他的农场的西北部份占领了一片立足之地。
草地像往常一样,被分割成一个高度为Y, 宽度为X的直角网格。
(1,1)是左下角的格(也就是说坐标排布跟一般的X,Y坐标相同)。
乳草一开始占领了格(Mx,MyMx,My)。
每个星期,乳草传播到已被乳草占领的格子四面八方的每一个没有很多石头的格(包括垂直与水平相邻的和对角线上相邻的格)内。
1周之后,这些新占领的格又可以把乳草传播到更多的格里面了。
达达想要在草地被乳草完全占领之前尽可能的享用所有的牧草。
她很好奇到底乳草要多久才能占领整个草地。
如果乳草在0时刻处于格(Mx,MyMx,My),那么几个星期以后它们可以完全占领入侵整片草地呢(对给定的数据总是会发生)?
在草地地图中,”.”表示草,而””表示大石。
比如这个X=4, Y=3的例子。

.
.**.

如果乳草一开始在左下角(第1排,第1列),那么草地的地图将会以如下态势发展:
… … MMM. MMMM MMMM
. MM. MM*. MMM MMM
M**. M**. M**. M**. M**M
星期数 0 1 2 3 4

乳草会在4星期后占领整片土地。
输入格式
第1行: 四个由空格隔开的整数: X, Y, MxMx, MyMy
第2到第Y+1行: 每行包含一个由X个字符(”.”表示草地,””表示大石)构成的字符串,共同描绘了草地的完整地图。
输出格式
输出一个整数,表示乳草完全占领草地所需要的星期数。
数据范围
1≤X,Y≤1001≤X,Y≤100
输入样例:
4 3 1 1

.
.**.

输出样例:
4

这是一道思路很明显的题目,直接上bfs,直到当队列为空时,就侵占完了。
不过自己做的时候还是遇到了一些问题:
1.把起点压进队列的时候总是有问题,调试的时候看now的那几个参数完全是不对的,应该是我的node定义那里的构造函数出问题了,所以就换了一种写法
2.平面直角坐标系左边和数组坐标的转换问题,开始想了一会没想到就找公式了:对于平面直角坐标系里的坐标(x,y),其对应的数组坐标应为(总行数-(y+1),x。

差不多就这些吧,还是要多练!

在这里插入代码片
```#include<bits/stdc++.h>
using namespace std;
int x,y,mx,my;
bool f;
int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,-1},{-1,1}};
int ans;
struct node{
 int ax;
 int ay;
 int d;
};
bool in(int tx,int ty) {
 return tx>=0&&tx<y&&ty>=0&&ty<x;
}
char a[105][105];
int bfs(int sx,int sy) {
 queue<node> q;
 node s;
 s.ax=sx;
 s.ay=sy;
 s.d=0;
 q.push(s);
 a[sx][sy]='M';
 node now;
 while(!q.empty()) {
  now=q.front();
  q.pop();
  for (int i=0;i<8;i++) {
   int tx=now.ax+dir[i][0];
   int ty=now.ay+dir[i][1];
   if (in(tx,ty)&&a[tx][ty]!='*'&&a[tx][ty]!='M'&&a[tx][ty]=='.') {
     a[tx][ty]='M';
     node b;
     b.ax=tx;
     b.ay=ty;
     b.d=now.d+1;
     q.push(b);
     }
    }
   }
   return now.d;
  }
int main() {
 cin>>x>>y;
 cin>>mx>>my;
 for (int i=0;i<y;i++) {
  for (int j=0;j<x;j++) {
   cin>>a[i][j];
  }
 }
 mx-=1;
 my-=1;
 cout<<bfs(y-my-1,mx)<<endl;
 return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值