在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。
返回区域的数目。
输入格式:
第一行输入一个正整数N(N<=30)
随后N行,每行输入一个长度为N的字符串,字符串仅有 /、\ 或空格构成
输出格式:
请输出由这些字符划分出来的区域数目,结果为一个正整数。
输入样例1:
2
/
/
输出样例1:
2
样例解释1:
2x2 网格如下:
输入样例2:
2
\/
/\
输出样例2:
4
样例解释2:
2x2 网格如下:
题目大意:
给由'\','/',' '组成的n*n的图。问分割完后有几块?
思路:
把一块分成4块,并查集。
方法:
思考每一块自身的合并情况,再考虑红线连接情况和蓝线连接情况。
核心连接区块代码:
if(c == ' ')//块内连接情况 for(ll i = 0 ; i < 3 ; i ++) bing(w+i,w+i+1); if(c == '/') bing(w,w+3),bing(w+2,w+1); if(c == '\\') bing(w,w+1),bing(w+2,w+3); if(i > 0)bing(w,w-n*4+2);//红线连接情况 if(j > 0)bing(w+3,w-3);//蓝线连接情况
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n"
const ll N = 1e5+7;
ll n,v[N];
string s;
ll find(ll x){
return x == v[x] ? x : v[x] = find(v[x]);
}
void bing(ll x ,ll y){
ll tx=find(x),ty=find(y);
if(tx > ty)swap(tx,ty);
v[ty]=tx;
}
void solve(){
cin >> n;cin.get();
for(ll i = 1 ; i <= n*n*4 ; i ++)v[i]=i;
ll w=1,sum=0;
for(ll i = 0 ; i < n ; i ++){
getline(cin,s);
for(ll j = 0 ; j < n ; j ++){
char c;c=s[j];
if(c == ' ')//块内连接情况
for(ll i = 0 ; i < 3 ; i ++)
bing(w+i,w+i+1);
if(c == '/')
bing(w,w+3),bing(w+2,w+1);
if(c == '\\')
bing(w,w+1),bing(w+2,w+3);
if(i > 0)bing(w,w-n*4+2);//红线连接情况
if(j > 0)bing(w+3,w-3);//蓝线连接情况
w+=4;
}
}
for(ll i = 1 ; i <= n*n*4 ; i ++)
if(v[i] == i)sum++;
cout << sum << endl;
return ;
}
int main(){
ll t=1;//cin >> t;
while(t--)solve();
return 0;
}