• 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;
    }
  • 相关阅读:
    [YTU]_2436( C++ 习题 输出日期时间--友元类)
    [YTU]_2435 ( C++ 习题 输出日期时间--友元函数)
    病毒侵袭
    石子合并(区间DP经典例题)
    AC自动机模板2
    【模板】最近公共祖先(LCA)
    华华给月月出题
    线性筛素数
    华华开始学信息学
    华华和月月种树
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4542598.html
Copyright © 2020-2023  润新知