经典BFS-长草问题

该程序使用C++实现了一个广度优先搜索(BFS)算法,处理一个n*m的地图,其中g代表草地。算法会模拟经过k次生长后,草地扩张的情况,每次扩张从已存在的草地结点向外扩展。地图用二维数组表示,通过队列进行广搜,并更新地图状态。
摘要由CSDN通过智能技术生成

 

#include<bits/stdc++.h>
using namespace std;
const int M = 1005;
struct PII{
	int first;
	int second;
}; 
PII tempPair;//临时结点
//这里不能写map,因为会与库函数map冲突 
char Map[M][M];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
int n; //n行
int m; //m列
int k; //k次,这里明确了退出条件就无需再用check了 
queue<PII> q; //广搜用到队列
int len; // 记录结点数量,方便后续计算k

bool pd(int x, int y){
	if(x<1||x>n||y<1||y>n||Map[x][y]=='g') return false;
	return true;
}

void bfs(){
	while(!q.empty()&&k>0){
		tempPair = q.front();
		q.pop();
		int x = tempPair.first;
		int y = tempPair.second;
		for(int i = 0; i < 4; i++){
			int nowx = dx[i]+x;
			int nowy = dy[i]+y;
			if(!pd(nowx,nowy)) continue;
			q.push({nowx,nowy});
			Map[nowx][nowy] = 'g';
		}
		len--;//每取出一个结点就-- 
		if(len==0){
			//当len==0表示当前月扩展完成,k--
			k--;
			len = q.size(); //继续赋值下一层结点数 
		}
	}
}

int main(){
	cin>>n>>m;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			cin>>Map[i][j];
			if(Map[i][j]=='g'){
				tempPair.first = i;
				tempPair.second = j;
				q.push(tempPair); //初始树结点加入队列 
			}
		}
	}
	len = q.size();//记录第一层的结点数方便后续k的计算
	cin>>k;
	bfs();//广搜调整好长了k个月后的草分布图
	//输出长了k个月后的草分布图 
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			cout<<Map[i][j];
		}
		cout<<endl;
	}
	return 0;
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nefelibata_2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值