题意:
有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); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-11 07:21:39