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