二零一五年百度之星程序设计大赛-1003棋盘占领

2015年百度之星程序设计大赛-1003棋盘占领

棋盘占领

 
 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
4
2 2
2
1 1
2 2
3 3
3
1 1
2 3
3 2
2 4
5
1 1
1 1
1 2
1 3
1 4
2 4
2
1 1
2 4
Sample Output
Case #1:
4
Case #2:
9
Case #3:
4
Case #4:
2


#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<math.h>
#include<algorithm>
using namespace std;

int bb[505][505];


int main()
{
    int T,m,n;
    int t,i,j;
    int g;
    int x,y;
    int count,flag;
    cin>>T;
    for(t=1;t<=T;t++)
    {
        memset(bb,0,sizeof(bb));
        cin>>n>>m;
        cin>>g;
        for(i=0;i<g;i++)
        {
            cin>>x>>y;
            bb[x][y]=1;
        }
        
        while(1){
            flag=0;
            for(i=1;i<=n;i++)
            {
                count=0;
                for(j=1;j<=m;j++)
                {
                    if(bb[i-1][j]==1)count++;
                    if(bb[i+1][j]==1)count++;
                    if(bb[i][j-1]==1)count++;
                    if(bb[i][j+1]==1)count++;
                    if(count==2)
                    {
                        if(bb[i-1][j]==1 && bb[i+1][j]==1) count=0;
                        else if(bb[i][j+1]==1 && bb[i][j-1]==1) count=0;
                    }
                    if(count>1 && bb[i][j]==0) 
                    {
                        bb[i][j]=1;
                        flag=1;
                    }
                    count=0;
                }
            }
            if(flag==0) break;
        }
        count=0;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
                if(bb[i][j]==1) count++;
            //    cout<<bb[i][j]<<" ";
            //cout<<endl;
        }
        cout<<"Case #"<<t<<":"<<endl;
        cout<<count<<endl;
    }
    return 0;
}