码迷,mamicode.com
首页 > 其他好文 > 详细

CodeForces 318D Ants

时间:2015-08-17 12:04:28      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

题目链接

题意:

有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);
	}
} 

版权声明:本文为博主原创文章,未经博主允许不得转载。

CodeForces 318D Ants

标签:

原文地址:http://blog.csdn.net/doris1104/article/details/47721573

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!