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

A-Plague Inc

时间:2018-07-25 01:01:19      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:比较   abap   mem   ret   selected   repeat   lang   using   ted   

A-Plague Inc

 

题意:n*m个城市,给你初始几个感染病毒的城市坐标,每天这个城市都可以感染上下左右4个相临城市,问最后被感染的城市坐标,如果有多个,取x坐标小的,如果x坐标一样大,取y坐标小的。

题解:我是用的队列,可能做得麻烦了,先根据队列中的元素求出下一天感染的城市坐标,每次将新感染的城市入队,同时前一天感染的城市出队(注意要出干净,我就是干开始没出干净wa了几发)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2000 + 10;
int vis[maxn][maxn];
int main()
{
	//freopen("in.txt", "r", stdin);
	int n, m;
	while (scanf("%d%d", &n, &m) != EOF)
	{
		int num;
		pair<int, int>ans;
		memset(vis, 0, sizeof vis);
		scanf("%d", &num);
		queue<pair<int, int> > q;
		ll sum = num;
		for (int i = 0; i < num; i++)
		{
			int x, y;
			scanf("%d%d", &x, &y);
			q.push(make_pair(x, y));
			vis[x][y] = 1;
		}
                //没有全部感染则一直入队
		while (sum < n * m)
		{
			int tmp = q.size();
                        //根据前一天的感染城市求出4个方向新感染的城市
			for (int i = 0; i < tmp; i++)
			{    
				if (q.front().second + 1 <= m && !vis[q.front().first][q.front().second + 1])
				{
					q.push(make_pair(q.front().first, q.front().second + 1));
					vis[q.front().first][q.front().second + 1] = 1;
					sum++;
				}
				if (q.front().second - 1 > 0 && !vis[q.front().first][q.front().second - 1])
				{
					q.push(make_pair(q.front().first, q.front().second - 1));
					vis[q.front().first][q.front().second - 1] = 1;
					sum++;
				}
				if (q.front().first + 1 <= n && !vis[q.front().first + 1][q.front().second])
				{
					q.push(make_pair(q.front().first + 1, q.front().second));
					vis[q.front().first + 1][q.front().second] = 1;
					sum++;
				}
				if (q.front().first - 1 > 0 && !vis[q.front().first - 1][q.front().second])
				{
					q.push(make_pair(q.front().first - 1, q.front().second));
					vis[q.front().first - 1][q.front().second] = 1;
					sum++;
				}
				q.pop();//用完出队
			}
		}
		ans = q.front();
                //比较最后一次入队元素中满足条件的答案
		while (!q.empty())
		{

			if (ans.first > q.front().first)
				ans = q.front();
			else if (ans.first == q.front().first && q.front().second < ans.second)
				ans = q.front();
			q.pop();
		}
		printf("%d %d\n", ans.first, ans.second);
	}
	return 0;
}
技术分享图片

A-Plague Inc

标签:比较   abap   mem   ret   selected   repeat   lang   using   ted   

原文地址:https://www.cnblogs.com/kuroko-ghh/p/9363411.html

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