#64-【模拟】屠城(zly#3)

版权声明:反正也没有人会转,下一个 https://blog.csdn.net/drtlstf/article/details/82084652

Description

当阿尔萨斯到达斯坦索姆的同时,光明使者乌瑟尔也及时赶来。但这时众人骇然发现一切都已经太晚了——被瘟疫感染的谷物已经发放到市民手中!
这些无辜的市民必将会感染瘟疫而成为天灾军团的部队。于是阿尔萨斯命令乌瑟尔和白银之手骑士团屠杀市民。当乌瑟尔拒绝执行这个命令时,阿尔萨斯竟然宣判德高望重的光明使者叛国。心灰意冷的乌瑟尔和他麾下的圣骑士愤然离城。而吉安娜也极其失望地离开。在最绝望无助的时候,没有人愿意支持年轻王子的抉择,留给他的只剩下无尽的痛苦。尽管众叛亲离,阿尔萨斯还是将他的计划付诸实施。他命令士兵将感染瘟疫的无辜市民屠戮殆尽,并把城内所有的建筑烧得一干二净!但是同时,恐惧魔王梅尔甘尼斯也正在将市民们转化为不死族。
给出斯坦索姆的地图和阿尔萨斯与梅尔甘尼斯的位置,每分钟阿尔萨斯和梅尔甘尼斯会在部队所在的地方屠杀市民,当房子烧毁后,阿尔萨斯会派他的军队向4个房屋未烧毁的方向(上下左右)移动。阿尔萨斯想知道是他还是梅尔甘尼斯杀的比较快,于是要求你这位御用编程师将k分钟后的情况给他。注意:如果阿尔萨斯和梅尔甘尼斯相遇,则阿尔萨斯会击退梅尔甘尼斯再烧毁房屋。

Input

输入文件名为massacre.in。
输入的第一行包含两个数n、m和k,表示城市的长、宽和阿尔萨斯想知道情况的时间。
接下来n行,每行m个字符(中间无空格),‘A’表示阿尔萨斯,‘M’表示梅尔甘尼斯,‘#’表示墙,‘.’表示房子。

Output

输出文件名为massacre.out。
输出k分钟后的情况,被阿尔萨斯消灭的房子用‘a’表示,梅尔甘尼斯的用‘m’表示。 

Sample Input

5 5 4
A....
.....
.....
.....
....M

Sample Output

Aaaaa
aaaam
aaamm
aammm
ammmM

HINT

【数据说明】
对于100%的数据,1<=n,m<=500,k的范围保证有解(反正开int就够了)。

一个很久以前AC的题

当时不知道什么叫队列,直接模拟!

#include <iostream>

#define SIZE 1000

using namespace std;

char c[SIZE][SIZE];

int main()
{
	int n, m, t, i, j;
	
	cin >> n >> m >> t;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			cin >> c[i][j];
		}
	}
	
	while (t--)
	{
		for (i = 0; i < n; i++) // 大模拟
		{
			for (j = 0; j < m; j++)
			{
				if ((c[i][j] == 'A') || (c[i][j] == 'a'))
				{
					if ((i > 0) && (c[i-1][j] == '.'))
					{
						c[i-1][j] = '&'; // 反正就这样处理(很暴力)
					}
					if ((i < n - 1) && (c[i+1][j] == '.'))
					{
						c[i+1][j] = '&';
					}
					if ((j > 0) && (c[i][j-1] == '.'))
					{
						c[i][j-1] = '&';
					}
					if ((j < m - 1) && (c[i][j+1] == '.'))
					{
						c[i][j+1] = '&';
					}
				}
			}
		}
		
		for (i = 0; i < n; i++)
		{
			for (j = 0; j < m; j++)
			{
				if ((c[i][j] == 'M') || (c[i][j] == 'm'))
				{
					if ((i > 0) && (c[i-1][j] == '.'))
					{
						c[i-1][j] = '*';
					}
					if ((i < n - 1) && (c[i+1][j] == '.'))
					{
						c[i+1][j] = '*';
					}
					if ((j > 0) && (c[i][j-1] == '.'))
					{
						c[i][j-1] = '*';
					}
					if ((j < m - 1) && (c[i][j+1] == '.'))
					{
						c[i][j+1] = '*';
					}
				}
			}
		}
		
		for (int i = 0; i < n; i++) // 为了防止a.......一步变成aaaaaaaa......
		{
			for (int j = 0; j < m; j++)
			{
				if (c[i][j] == '&')
				{
					c[i][j] = 'a';
				}
				else if (c[i][j] == '*')
				{
					c[i][j] = 'm';
				}
			}
		}
	}
	
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			cout << c[i][j];
		}
		cout << endl;
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/drtlstf/article/details/82084652
64-