闲的没事,出了道题,答出者,奖赏解决方案一个

《Dan的小香脚》

题目背景:

Dan具有有史以来最香的香脚,他的jio能释放出巨大的毒气

题目描述:

Dan的体委ZCJ把他们搞得没法干饭,于是,他决定报复社会!他们的学校是一个迷宫,他脱下鞋子,让脚气扩散。jio气会从一个区域扩散到相邻的区域(上下左右)。迷宫用一个二维方格表示,其中‘0’表示可以通行的区域,‘1’表示墙壁,无法穿过。感染会从有香脚的格子传播到四个相邻的格子(上下左右)。如果一个格子被感染,则在下一个步骤之前,它将成为“感染”的状态。你的任务是模拟这一过程,并确定在给定步数后哪些格子会被感染。

输入格式:

  1. 第一行输入两个整数 nm,表示迷宫的行数和列数(1 ≤ n, m ≤ 100)。
  2. 接下来的 n 行中,每行包含 m 个字符:‘0’表示可以通行(无香脚),‘1’表示墙壁(有香脚),‘2’表示初始感染(香脚格子)。
  3. 最后一行输入一个整数 k,表示步数(1 ≤ k ≤ 10)。

输出格式:

输出经过 k 步后,迷宫上每个格子的状态,用字符表示:‘0’(无香脚),‘1’(墙壁),‘2’(感染)为输出的状态,以行的形式输出。

示例

输入示例:

4 5
0 1 0 0 2
0 1 0 1 0
0 0 0 1 0
1 1 0 0 0
2

输出示例:

0 1 2 2 2
0 1 0 1 2
0 0 0 1 2
1 1 0 0 0

谁来帮助大家,解决香脚?

4 个赞

挖去这题出的太好了

挺简单的捏,广搜一下,就A了

2 个赞

谁来帮助大家,解决香脚?

1 个赞

不会

e
6

1 个赞

等楼逸杨来解决吧。。。

1 个赞

@linan04129 ,出来

1 个赞

不是,你真出啊

#include <iostream>
#include <queue>

using namespace std;

const int MAXN = 105;
const int MAXM = 105;

int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};

struct node {
	int x, y;
};

void bfs(int n, int m, int mapn[MAXN][MAXM], int k) {
	// 使用队列来记录需要处理的感染格子
	queue<node> qu;
	
	// 初始化队列,将初始感染的格子加入队列
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (mapn[i][j] == 2) { // 状态2代表初始感染
				qu.push({i, j});
			}
		}
	}
	
	// 进行k步模拟感染扩散
	for (int j = 0; j < k; j++) {
		int size = qu.size();
		for (int k = 0; k < size; k++) {
			node now = qu.front();
			qu.pop();
			
			// 扩散到上下左右四个方向
			for (int i = 0; i < 4; i++) {
				int now_x = now.x + dx[i];
				int now_y = now.y + dy[i];
				
				// 检查合法性和是否可感染
				if (now_x >= 0 && now_x < n && 
					now_y >= 0 && now_y < m && 
					mapn[now_x][now_y] == 0) {
					mapn[now_x][now_y] = 2; // 将其感染
					qu.push({now_x, now_y}); // 加入队列以便后续处理
				}
			}
		}
	}
}

int main(void) 
{
	int n, m; // 行数和列数
	cin >> n >> m;
	int mapn[MAXN][MAXM]; // 迷宫状态
	
	// 输入迷宫状态
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			char c;
			cin >> c;
			if (c == '0') {
				mapn[i][j] = 0; // 无香脚格子
			} else if (c == '1') {
				mapn[i][j] = 1; // 墙壁
			} else if (c == '2') {
				mapn[i][j] = 2; // 初始感染格子
			}
		}
	}
	
	int k; // 步数
	cin >> k;
	
	// 进行感染扩散模拟
	bfs(n, m, mapn, k);
	
	// 输出最终状态
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (mapn[i][j] == 0) {
				cout << '0';
			} else if (mapn[i][j] == 1) {
				cout << '1';
			} else if (mapn[i][j] == 2) {
				cout << '2';
			}
			if (j < m - 1) cout << ' ';
		}
		cout << endl;
	}
	
	return 0;
}

不是,你真做啊

1 个赞

666

1 个赞

NB

我给他的代码

1 个赞

他做不带空格的

1 个赞

送你个
Dan

1 个赞
#include <iostream>
#include <queue>

using namespace std;

const int MAXN = 105;
const int MAXM = 105;

int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};

struct node {
	int x, y;
};

void dfs(int x, int y, int step, int n, int m, int mapn[MAXN][MAXM], int k) {
	if(step>=k)return;
	for (int i = 0; i < 4; i++) {
		int now_x = x + dx[i];
		int now_y = y + dy[i];	
		if (now_x >= 0 && now_x < n && now_y >= 0 && now_y < m && mapn[now_x][now_y] == 0) {
			mapn[now_x][now_y] = 2;
			dfs(now_x,now_y,step+1,n,m,mapn,k);		
		}
	}
}

int main(void) 
{
	int n, m; // 行数和列数
	cin >> n >> m;
	int mapn[MAXN][MAXM]; // 迷宫状态
	
	// 输入迷宫状态
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			char c;
			cin >> c;
			if (c == '0') {
				mapn[i][j] = 0; // 无香脚格子
			} else if (c == '1') {
				mapn[i][j] = 1; // 墙壁
			} else if (c == '2') {
				mapn[i][j] = 2; // 初始感染格子
			}
		}
	}
	
	int k; // 步数
	cin >> k;
	// 进行感染扩散模拟
	vector<int>mbx;
	vector<int>mby;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if(mapn[i][j]==2){
				mbx.push_back(i);
				mby.push_back(j);
			}
		}
	}
	for(int i=0;i<mbx.size();i++)
		dfs(mbx[i],mby[i],0,n, m, mapn, k);
	
	// 输出最终状态
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (mapn[i][j] == 0) {
				cout << '0';
			} else if (mapn[i][j] == 1) {
				cout << '1';
			} else if (mapn[i][j] == 2) {
				cout << '2';
			}
			if (j < m - 1) cout << ' ';
		}
		cout << endl;
	}
	
	return 0;
}

dfs做法

《根据真实事件改编》, @汪嘉乐 你真棒!不就我的改了点吗
不给

1 个赞

Dan是谁

楼逸杨