zoukankan      html  css  js  c++  java
  • 【[Offer收割]编程练习赛12 C】矩形分割

    【题目链接】:http://hihocoder.com/problemset/problem/1495

    【题意】

    【题解】

    把每个方块都再分成3*3的小块;
    这样;
    对于一个方块来说
    如果是’’
    则把
    (3*x,3*y)和(3*x+1,3*y+1)以及(3*x+2,3*y+2)都占据了
    表示这些点是线.
    如果是’/’
    则把
    (3*x+2,3*y)和(3*x+1,3*y+1)以及(3*x,3*y+2)都占据了
    也表示这些点是线;
    那些不是线的方块就置为空白区域;
    这样就能够用一个个方块来表示空白区域了;
    从空白区域往做floodfill;
    每做一次floodfill就表示一个区域;
    累加区域最后输出就好;

    【完整代码】

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define ps push_back
    #define fi first
    #define se second
    #define rei(x) scanf("%d",&x)
    #define rel(x) scanf("%lld",&x)
    #define ref(x) scanf("%lf",&x)
    
    typedef pair<int, int> pii;
    typedef pair<LL, LL> pll;
    
    const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
    const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
    const double pi = acos(-1.0);
    const int N = 110;
    
    int n, m;
    char t;
    string tu[N];
    bool bo[N*3][N*3];
    
    void dfs(int x,int y)
    {
        if (x<=-1 || x>=3*n || y <=-1 || y>=3*m) return;
        if (bo[x][y]) return;
        bo[x][y] = true;
        rep1(i,1,4)
            dfs(x+dx[i],y+dy[i]);
    }
    
    int main()
    {
        //freopen("F:\rush.txt", "r", stdin);
        rei(n), rei(m);
        t = getchar();
        rep1(i, 1, n)
        {
            getline(cin,tu[i]);
            tu[i]=' '+tu[i];
        }
        rep1(i,1,n)
        {
            rep1(j,1,m)
            {
                if (' '==tu[i][j]) continue;
                if ('\'==tu[i][j])
                {
                    bo[(i-1)*3][(j-1)*3]=bo[(i-1)*3+1][(j-1)*3+1]=bo[(i-1)*3+2][(j-1)*3+2] = true;
                }
                if ('/'==tu[i][j])
                {
                    bo[(i-1)*3+2][(j-1)*3]=bo[(i-1)*3+1][(j-1)*3+1]=bo[(i-1)*3][(j-1)*3+2] = true;
                }
            }
        }
        int ans = 0;
        rep1(i,0,3*n-1)
            rep1(j,0,3*m-1)
            if (!bo[i][j])
            {
                ans++;
                dfs(i,j);
            }
        printf("%d
    ",ans);
        //printf("
    %.2lf sec 
    ", (double)clock() / CLOCKS_PER_SEC);
        return 0;
    }
    
  • 相关阅读:
    计算在线人数
    微软MSMQ消息件研究(一)
    jQuery循序渐进2
    单点登陆的ASP.NET应用程序设计[zt]
    利用SQL2005的缓存依赖
    .Net 操作MSMQ
    GridView中数据格式化
    TcpListener/TcpClient/UdpClient 的区别及联系
    微软消息件MSMQ研究DEMO(二)
    Nhibernate(1)
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626492.html
Copyright © 2011-2022 走看看