農場灌漑
時間制限:1000MSメモリ制限:32768KB 64ビットIOフォーマット:%I64d&%I64u
説明
ベニーには灌漑用の広々とした農地があります。農地は長方形で、たくさんの四角に分かれています。水道管はこれらの正方形に配置されます。正方形が異なれば、パイプの種類も異なります。図1に示すように、AからKまでの11種類のパイプがあります。
図1
ベニーは自分の農場の地図を持っています。これは、農場全体の水道管の分布を示す一連のマークです。たとえば、彼が地図を持っている場合
ADC
FJK
IHE
その後、水道管は次のように配布されます
図2
いくつかの正方形の中央にいくつかの源泉があり、水がパイプに沿ってある正方形から別の正方形に流れることができます。水の流れが1つの正方形を横切る場合、この正方形の農地全体が灌漑され、秋には豊作になります。
今、ベニーは、農地全体を灌漑するために、少なくともいくつの源泉を見つけるべきかを知りたがっています。彼を助けることができますか?
注:上記の例では、図2の赤い点が示すように、少なくとも3つのウェルスプリングが必要です。
入力
いくつかのテストケースがあります!各テストケースでは、最初の行に2つの整数MとNが含まれ、その後にM行が続きます。これらの各行には、「A」から「K」の範囲のN文字があり、対応する正方形上の水道管のタイプを示します。負のMまたはNは入力の終了を示します。それ以外の場合は、1 <= M、N <= 50と見なすことができます。
出力
テストケースごとに、必要な最小数のウェルスプリングを1行で出力します。
サンプル入力
2 2
DK
HF
3 3
ADC
FJK
IHE
-1 -1
サンプル出力
2
3
タイトルの意味:接続された水道管はエリアです、あなたはエリアの数を見つけることができます
分析:この質問を見たとき、私はそれについて慎重に考えました。これは油田問題の検索の変形ではありませんか?複数の2次元文字列を1つの大きな2次元文字列に連結する必要があるだけです。
たとえば、以下に定義されている水道管の形状は、文字列で表されます。
A: .#. B: .#.
##. .##
... ...
**すべての水道管の形状を初期化すると、作業を開始できます。
入力文字が「A」であるか他のものであるかに応じて、2次元文字列(水道管の形状を表す)を中間の2次元文字列に入れます。voidxz(int i、int j);
次に、それらを1つずつ接続します。これは、水道管(パズル)に接続するプロセスをシミュレートするのと同じです。
スプライシング文字列のコアコード:
for(int i=0 ; i<n*3 ; i++){
for(int j=0 ; j<m*3 ; j++){
k=i/3;
t=j/3;
xz(k,t);
map[i][j]=tem[i%3][j%3];
}
}
}
効果は次のとおりです。
マップ文字列は問題ありません。
油田キットを使い始めました
最初に「#」を見つけ、彼が上下に歩くことができるすべての「#」を作成し、それらを「。」に変え、ユニコムの水道管の数+1を記録してから、次の「#」を探し始めます。
コードを添付してください:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int maxn =1e3+5;
int n,m;
int changeX[4]={
0,0,-1,1};
int changeY[4]={
1,-1,0,0};
char tem[4][4];
char sr[55][55];
char map[maxn][maxn];
char A[4][4]={
".#.","##.","..."};
char B[4][4]={
".#.",".##","..."};
char C[4][4]={
"...","##.",".#."};
char D[4][4]={
"...",".##",".#."};
char E[4][4]={
".#.",".#.",".#."};
char F[4][4]={
"...","###","..."};
char G[4][4]={
".#.","###","..."};
char H[4][4]={
".#.","##.",".#."};
char I[4][4]={
"...","###",".#."};
char J[4][4]={
".#.",".##",".#."};
char K[4][4]={
".#.","###",".#."};
int check(int x,int y){
if(x<0||y<0||x>n*3||y>m*3||map[x][y]!='#') return 0;
return 1;
}
void xz(int i,int j){
if(sr[i][j]=='A') {
for(int i=0 ; i<3 ; i++)
for(int j=0 ; j<3 ; j++)
tem[i][j]=A[i][j];
}
if(sr[i][j]=='B') {
for(int i=0 ; i<3 ; i++)
for(int j=0 ; j<3 ; j++)
tem[i][j]=B[i][j];
}
if(sr[i][j]=='C') {
for(int i=0 ; i<3 ; i++)
for(int j=0 ; j<3 ; j++)
tem[i][j]=C[i][j];
}
if(sr[i][j]=='D') {
for(int i=0 ; i<3 ; i++)
for(int j=0 ; j<3 ; j++)
tem[i][j]=D[i][j];
}
if(sr[i][j]=='E') {
for(int i=0 ; i<3 ; i++)
for(int j=0 ; j<3 ; j++)
tem[i][j]=E[i][j];
}
if(sr[i][j]=='F') {
for(int i=0 ; i<3 ; i++)
for(int j=0 ; j<3 ; j++)
tem[i][j]=F[i][j];
}
if(sr[i][j]=='G') {
for(int i=0 ; i<3 ; i++)
for(int j=0 ; j<3 ; j++)
tem[i][j]=G[i][j];
}
if(sr[i][j]=='H') {
for(int i=0 ; i<3 ; i++)
for(int j=0 ; j<3 ; j++)
tem[i][j]=H[i][j];
}
if(sr[i][j]=='I') {
for(int i=0 ; i<3 ; i++)
for(int j=0 ; j<3 ; j++)
tem[i][j]=I[i][j];
}
if(sr[i][j]=='J') {
for(int i=0 ; i<3 ; i++)
for(int j=0 ; j<3 ; j++)
tem[i][j]=J[i][j];
}
if(sr[i][j]=='K') {
for(int i=0 ; i<3 ; i++)
for(int j=0 ; j<3 ; j++)
tem[i][j]=K[i][j];
}
}
void gz(){
int t1,t2;
t1=t2=0;
int k=0;
int t=0;
for(int i=0 ; i<n*3 ; i++){
for(int j=0 ; j<m*3 ; j++){
k=i/3;
t=j/3;
xz(k,t);
map[i][j]=tem[i%3][j%3];
}
}
}
void dfs(int x,int y){
int i;
for(i=0 ; i<4 ; i++){
int nowX = x+changeX[i];
int nowY = y+changeY[i];
if(check(nowX,nowY)){
map[nowX][nowY]='.';
dfs(nowX,nowY);
}
}
}
int main(){
int ans;
while(~scanf("%d%d",&n,&m)){
ans=0;
if(n==-1&&m==-1) break;
for(int i=0 ; i<n ; i++){
for(int j=0 ; j<m ; j++){
cin>>sr[i][j];
}
}
gz();
/*for(int i=0 ; i<n*3 ; i++){
for(int j=0 ; j<m*3 ; j++)
printf("%c",map[i][j]);
puts("");
}*/
for(int i=0 ; i<n*3 ; i++){
for(int j=0 ; j<m*3 ; j++)
if(map[i][j]=='#'){
dfs(i,j);
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}