2015 百度之星 1003 棋盘占领 dfs

棋盘占领

Time Limit: 20 Sec  Memory Limit: 256 MB

题目连接

http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=601&pid=1003

Description

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


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


10

01

会最终会变成

11

11

而101则保持为101不变

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

Input

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

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


第二行是一个整数g(1≤g≤1000),表示我们一开始占领的城池数。
然后跟随g行,第i行一对整数x,y(1≤x≤n,1≤y≤m),表示占领的第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

HINT

题意

题解:

直接暴力修改就好,这份代码是kuangbin的,我看不了我的代码 = =

我是dfs修改的,和某次cf的题很类似

代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
bool f[550][550];

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int T;
    int n,m;
    int iCase = 0;
    scanf("%d",&T);
    while(T--){
        iCase++;
        scanf("%d%d",&n,&m);
        memset(f,false,sizeof(f));
        int x,y;
        int g;
        scanf("%d",&g);
        while(g--){
            scanf("%d%d",&x,&y);
            x--;
            y--;
            f[x][y] = true;
        }
        while(1){
            bool add = false;
            for(int i = 0;i < n;i++)
                for(int j = 0;j < m;j++){
                    if(f[i][j])continue;
                    if(i > 0 && j < m-1 && f[i-1][j] && f[i][j+1]){
                        f[i][j] = true;
                        add = true;
                        continue;
                    }
                    if(i > 0 && j > 0 && f[i-1][j] && f[i][j-1]){
                        f[i][j] = true;
                        add = true;
                        continue;
                    }
                    if(i < n-1 && j > 0 && f[i+1][j] && f[i][j-1]){
                        f[i][j] = true;
                        add = true;
                        continue;
                    }
                    if(i < n-1 && j < m-1 && f[i+1][j] && f[i][j+1]){
                        f[i][j] = true;
                        add = true;
                        continue;
                    }
                }
            if(!add)break;
        }
        int ans = 0;
        for(int i = 0;i < n;i++)
            for(int j = 0;j < m;j++)
                ans += f[i][j];
        printf("Case #%d:
%d
",iCase,ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/qscqesze/p/4542598.html