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

HDU ACM 5254 棋盘占领->暴力枚举

时间:2015-06-03 10:04:18      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   编程   

分析:暴力,注意有公共点是指两个城池是否相邻。

#include<iostream>
#include<vector>
using namespace std;

bool map[505][505];
vector<int> vx;
vector<int> vy;
int n,m;

bool judge(int x,int y)
{
	bool t1,t2,t3,t4;

	t1=t2=t3=t4=0;
	if(x>1 && map[x-1][y]==true) t1++;
	if(x<n && map[x+1][y]==true) t2++;
	if(y>1 && map[x][y-1]==true) t3++;
	if(y<m && map[x][y+1]==true) t4++;

	return t1&t3 | t1&t4 | t2&t3 | t2&t4;  //有公共点的城池被占领情况
}

int main()      
{
	int T,t,i,j,q,x,y;
	bool fg;

	ios::sync_with_stdio(false);
	cin>>T;
	t=0;
	while(T--)
	{
		cin>>n>>m>>q;
		memset(map,false,sizeof(map));
		for(i=0;i<q;i++)
		{
			cin>>x>>y;
			map[x][y]=true;
		}
		vx.clear();
		vy.clear();
		for(i=1;i<=n;i++)
			for(j=1;j<=m;j++)
				if(map[i][j]==false)
				{
					vx.push_back(i);
					vy.push_back(j);
				}
		fg=false;
		while(!fg)       //处理到不存在可占领城池为止
		{
			fg=true;
			for(i=0;i<vx.size();i++)
			{
				x=vx[i];
				y=vy[i];
				if(judge(x,y))
				{
					fg=false;
					map[x][y]=true;
					vx.erase(vx.begin()+i);
					vy.erase(vy.begin()+i);
					i--;
				}
			}
		}
		cout<<"Case #"<<++t<<":"<<endl;
		cout<<n*m-vx.size()<<endl;;
	}
    return 0;      
}


HDU ACM 5254 棋盘占领->暴力枚举

标签:c   c++   acm   算法   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/46335975

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