Comfortable Cows【BFS】【模拟】

  • Post author:
  • Post category:其他



>Link





luogu P7411




>Description

一个



1000

1000

1000*1000






1


0


0


0













1


0


0


0





的矩阵,每次在一个空格子上放一头牛,每时每刻询问最少还要放多少头牛,使得每一头牛上下左右相邻的牛的头数不等于3



>解题思路

直接模拟+广搜就可以了(感觉很多人写的是深搜)

但是赛时我打的queue爆掉了才40分😡😡要用vector!



>代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define N 5000
using namespace std;

const int xxx[4] = {-1, 0, 0, 1}, yyy[4] = {0, -1, 1, 0};
struct node
{
	int x, y;
};
vector<node> q;
int n, ans, tot[N][N];
bool a[N][N], vis[N][N];

int main()
{
	int x, y, xx, yy, vx, vy, nd;
	scanf ("%d", &n);
	while (n--)
	{
		scanf ("%d%d", &x, &y);
		x += 1000, y += 1000;
		if (!a[x][y]) a[x][y] = 1;
		else
		{
			ans--;
			printf ("%d\n", ans);
			continue;
		}
		q.push_back ((node){x, y});
		vis[x][y] = 1;
		while (!q.empty())
		{
			node u = q.back();
			q.pop_back(), vis[u.x][u.y] = 0;
			if (!a[u.x][u.y]) ans++, a[u.x][u.y] = 1;
			tot[u.x][u.y] = 0;
			for (int i = 0; i < 4; i++)
			{
				xx = u.x + xxx[i], yy = u.y + yyy[i];
				tot[xx][yy]++;
				if (tot[xx][yy] == 3 && a[xx][yy])
				  for (int j = 0; j < 4; j++)
				  {
				  	vx = xx + xxx[j], vy = yy + yyy[j];
				  	if (!a[vx][vy] && !vis[vx][vy])
					  vis[vx][vy] = 1, q.push_back ((node){vx, vy});
				  }
				if (a[xx][yy]) tot[u.x][u.y]++;
				else nd = i;
			}
			if (tot[u.x][u.y] == 3)
			  vis[u.x + xxx[nd]][u.y + yyy[nd]] = 1,
			  q.push_back ((node){u.x + xxx[nd], u.y + yyy[nd]});
		}
		printf ("%d\n", ans);
	}
	return 0;
}



版权声明:本文为qq_43010386原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。