本来是道挺简单的模拟,被一个函数给坑死。。就是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;
}