【[Offer收割]编程练习赛12 C】矩形分割

  • Post author:
  • Post category:其他



【题目链接】:

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\n",ans);
    //printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7626492.html