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;
}