分析:暴力,注意有公共点是指两个城池是否相邻。
#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