ZOJ-3804

41 篇文章 0 订阅

本来是道挺简单的模拟,被一个函数给坑死。。就是memcpy这个函数,妹的查了N久的错就是不知道为毛,提交一直WA,本来也没什么算法,逻辑对了基本就能对,用了这个函数就WA,改成手工拷贝值就对了,我去,血的教训就是以后再也不用这个函数了。。

#include<cstdio>
#include<cstring>
#include<deque>
#include<algorithm>

using namespace std;

namespace
{
	struct Leave
	{
		int time, x, y;
	};

	bool cmp(Leave *p1, Leave *p2)
	{
		return p1->time < p2->time;
	}

	int dir[8][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 }, { -1, -1 }, {
			-1, 1 }, { 1, -1 }, { 1, 1 } };
}

int main()
{
	int Q;
	char dp[52][52], temp[52][52];
	scanf("%d", &Q);
	deque<Leave *> q;
	while (Q--)
	{
		q.clear();
		int N, M, F, K;
		scanf("%d%d%d%d", &N, &M, &F, &K);
		getchar();
		for (int i = 1; i <= N; i++)
			scanf("%s", &dp[i][1]);
		while (K--)
		{
			Leave *p = new Leave();
			scanf("%d %d %d", &p->time, &p->x, &p->y);
			q.push_back(p);
		}
		sort(q.begin(), q.end(), cmp);

		for (int t = 1; t <= F; t++)
		{
			for (int i = 1; i <= N; i++)
				for (int j = 1; j <= M; j++)
				{
					int awake = 0;
					for (int k = 0; k < 8; k++)
					{
						int ii = i + dir[k][0];
						int jj = j + dir[k][1];
						if (ii > 0 && ii <= N && jj > 0 && jj <= M
								&& dp[ii][jj] == '1')
							awake++;
					}

					if (dp[i][j] == '1' && (awake < 2 || awake > 3))
						temp[i][j] = '0';
					else if (dp[i][j] == '1' && (awake == 2 || awake == 3))
						temp[i][j] = '1';
					else if (dp[i][j] == '0' && awake == 3)
						temp[i][j] = '1';
					else
						temp[i][j] = dp[i][j];
				}

			for (int i = 1; i <= N; i++)
				for (int j = 1; j <= M; j++)
					dp[i][j] = temp[i][j];
//			memcpy(dp, temp, sizeof(temp));

			while (!q.empty() && (q.front()->time == t))
			{
				dp[q.front()->x][q.front()->y] = 'X';
				q.pop_front();
			}
		}
		for (int i = 1; i <= N; i++)
			puts(&dp[i][1]);

		for (size_t i = 0; i < q.size(); i++)
			delete q[i];
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值