题意:
有n只蚂蚁和m次询问
n只蚂蚁初始全部位于起点(0,0)处,每4只蚂蚁在同一格就会以该格为中心向上下左右四个方向爬一格
一只向上,一只向下,一只向左,一只向右
如果每个格子内的蚂蚁数量 < 4,那么蚂蚁就会停止运动
问你当所有的蚂蚁都停止运动后,给你任意的(x, y),输出该格子内的蚂蚁数量
思路:
模拟+暴力
因为询问x,y会有负的,所以不妨设起始坐标为(N,N),因为起始位置的蚂蚁最多也就30000只,所以N根本没必要开到1e9那么大,其实65就可以了,保险起见开了100,再大点估计要TLE;
当abs(x)和abs(y) > N的时候,超出范围,所以一定是0;
不停的遍历 (2*N) * (2*N) 的格子,直到没有一个格子的蚂蚁数量>=4为止。
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100;
typedef long long ll;
int n, t;
int map[2*N][2*N];
int main()
{
scanf("%d%d", &n, &t);
memset(map, 0, sizeof(map));
int x = 0, y = 0;
map[N][N] = n;
bool flag = 1;
while(flag)
{
flag = 0;
for(x = 0; x < N*2; x++)
{
for(y = 0; y < N*2; y++)
{
if(map[x][y] >= 4)
{
flag = 1;
int cnt = map[x][y] / 4;
map[x-1][y] += cnt;
map[x+1][y] += cnt;
map[x][y-1] += cnt;
map[x][y+1] += cnt;
map[x][y] -= cnt * 4;
}
}
}
}
while(t--)
{
scanf("%d%d", &x, &y);
printf("%d\n", abs(x)<N && abs(y) < N ? map[N+x][N+y] : 0);
}
}