版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QingCoffe/article/details/85208820
Limit Time
题意:有一个20X20的网格,每个网格里有个数字(0~3),每天网格里数字的变化是先将网格里本身的数字与其上下左右网格里数字依次相加,得到一个0~15的值k,这个值确定了题目里数组D[k],接下来我们只需要把网格里的值与D[k]相加,如果相加后的值大于3,变化后的值就为3,小于0则就为0。最后再根据题目将数字变成对应的字符。
# include<iostream>
# include<algorithm>
# include<queue>
#pragma warning (disable:4996)
# define BAN 20
using namespace std;
int D[16];
int map[BAN][BAN];//地图
int map_t[BAN][BAN];
char L[4] = { '.','!','X','#' };//格式参照
int dri[4][2] = { {0,1},{1,0},{0,-1},{-1,0} };//东南西北 左下右上
struct node {
int x, y;
node(int x_, int y_) {
x = x_; y = y_;
}
node() {}
}NeedRevise[BAN*BAN];
int NRIndex;
queue<node>q;
void count(const node&t) {
int x, y; x = t.x; y = t.y;
int sum = 0; q.push(t);
for (int i = 0; i < 4; i++) {
x += dri[i][0]; y += dri[i][1];
if ((x >= 0 && x < BAN) && (y >= 0 && y < BAN)) {
sum += map[x][y];
}
x = t.x; y = t.y;
}//四向搜索
sum += map[t.x][t.y];//加上自身
//((D[sum] + map[t.x][t.y] >= 3 )? (map[t.x][t.y] = 3) : (D[sum] + map[t.x][t.y] < 0 ? map[t.x][t.y] = 0 : map[t.x][t.y] = (D[sum] + map[t.x][t.y]) ));//计算出当前位置培养皿的值
if (D[sum] + map[t.x][t.y] >= 3)map_t[t.x][t.y] = 3;
else {
if (D[sum] + map[t.x][t.y] < 0)map_t[t.x][t.y] = 0;
else
map_t[t.x][t.y] = D[sum] + map[t.x][t.y];
}
}
void Fcheck(node&t) {//四向模拟
count(t);//先计算自己
NeedRevise[NRIndex++] = t;
int x, y;
x = t.x; y = t.y;//xy复位
for (int i = 0; i < 4; i++) {
x += dri[i][0]; y += dri[i][1];
if ((x >= 0 && x < BAN) && (y >= 0 && y < BAN)) {
node t_n; t_n.x = x; t_n.y = y;
count(t_n);
//count(node(x,y));
NeedRevise[NRIndex++] = t_n;//当前结点信息需要更新
}
x = t.x; y = t.y;
}//四向搜索
}
int main(void) {
//long start_time = GetTickCount(); //获取此程序段开始执行时间
int N;cin >> N;
int day,i,j;
while (N--) {
scanf("%d", &day);
for (i = 0; i < 16; i++) cin >> D[i];//录入D[k]信息
for (i = 0; i < BAN; i++)
for (j = 0; j < BAN; j++) {
scanf( "%d",&map[i][j]);
if (map[i][j]) {
node tn; tn.x = i; tn.y = j; q.push(tn);
}//将有细菌的地方入队
}//录入培养皿信息
while (day--) {
int qsize = q.size();
NRIndex = 0;//一天过后复原0
node t;
while (qsize--) {
t = q.front(); q.pop();//四向检查入队
Fcheck(t);//内部修改map值
}//模拟感染
for (i = 0; i < NRIndex; i++) {
t = NeedRevise[i];
map[t.x][t.y] = map_t[t.x][t.y];
}//更新一天的信息
}//模拟天数
for (i = 0; i < BAN; i++) {
for (j = 0; j < BAN; j++) {
printf("%c ", L[map[i][j]]);
//cout << L[map[i][j]] << " ";
}//模拟输出培养皿的样子
printf("\n");
}
}
//long end_time = GetTickCount(); //获取此程序段开始执行时间
//cout << endl << "程序段运行时间:" << (end_time - start_time) << "ms!" << endl; //差值即执行时间
system("pause");
return 0;
}