分析:暴力,注意有公共点是指两个城池是否相邻。
#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;
}
原文地址:http://blog.csdn.net/a809146548/article/details/46335975