hdu 5254 棋盘占领(百度之星2015初赛2 1003)暴力模拟

来源:互联网 发布:golang beego 编辑:程序博客网 时间:2024/06/03 17:55

棋盘占领

 
 Accepts: 937
 
 Submissions: 2201
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 32768/32768 K (Java/Others)
Problem Description

百小度最近迷恋上了一款游戏,游戏里有一个n*m的棋盘,每个方格代表一个城池。
一开始的时候我们有g支军队,驻扎并占领了其中某些城池。然后我们可以在这些被占领城池的基础上,吞并占领周围的城池。


而其吞并占领的规则是这样的——一旦一个城池A相邻的上下左右四个城池中至少存在两个被占领,且这两个被占领的城池有公共点,那么城池A也将被占领。
比如我们用1表示初始的占领状态,0表示初始的未占领状态。
那么——


10
01

会最终会变成

11
11

而101则保持为101不变

现在告诉你一张地图一开始所有被占领城池的信息,问你最后多少个城池会被我们占领。

Input

第一行为T,表示输入数据组数。

下面T组数据,对于每组数据,
第一行是两个数n,m(1n,m500),表示国土的大小为n*m。


第二行是一个整数g(1g1000),表示我们一开始占领的城池数。
然后跟随g行,第i行一对整数x,y(1xn,1ym),表示占领的第i个城池的坐标。 

Output

对第i组数据,输出

Case #i:

然后输出一行,仅包含一个整数,表示最终有多少个城池被占领。

Sample Input
42 221 12 23 331 12 33 22 451 11 11 21 31 42 421 12 4
Sample Output
Case #1:4Case #2:9Case #3:4Case #4:2
解题思路:

我暴力过掉了。

枚举每个未被占领的城市在当前是否会被占领。

用vector保存了未被占领的城市。

代码如下:

#include<iostream>#include<cstring>#include<vector>#include<cstdio>#include<algorithm>using namespace std;vector<int>vx;vector<int>vy;int n,m;int a[555][555];bool judge(int x,int y){    int tem1 = 0;    int tem2 = 0;    int tem3 = 0;    int tem4 = 0;    if(x>1&&a[x-1][y]==1)tem1++;    if(x<n&&a[x+1][y]==1)tem2++;    if(y>1&&a[x][y-1])tem3++;    if(y<m&&a[x][y+1])tem4++;    return ((tem1&tem3)|(tem1&tem4)|(tem2&tem3)|(tem2&tem4));}int main(){    int T,i,j,k,q,ca=1,x,y;    scanf("%d",&T);    while(T--)    {        scanf("%d%d%d",&n,&m,&q);        memset(a,0,sizeof(a));        for(i=0; i<q; i++)        {            scanf("%d%d",&x,&y);            a[x][y]=1;        }        vx.clear();        vy.clear();        for(i=1; i<=n; i++)        {            for(j=1; j<=m; j++)            {                if(a[i][j]==0)                {                    vx.push_back(i);                    vy.push_back(j);                }            }        }        bool flag = false;        while(!flag)        {            flag = true;            for(i=0; i<vx.size(); i++)            {                x = vx[i];                y = vy[i];                if(judge(x,y))                {                    flag = false;                    a[x][y]=1;                    vx.erase(vx.begin()+i);                    vy.erase(vy.begin()+i);                    i--;                }            }        }        printf("Case #%d:\n",ca++);        printf("%d\n",(n*m-vx.size()));    }    return 0;}


0 0