题目分析:给n*m块正方形地,问需要几个灌溉系统,
1.给每一块地,从左到右,从上到下,编号为0,1,....n*m-1。对于每一块地(x,y),扫描四个位置,如果可以连接,就把他们放到一个集合里,最后扫描集合数,
。。。。。代码有错误,,,不知道wa在那里
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
char maze[55][55];
int m,n;
int set[10000];
int find(int x)
{
int i;
for(i=x;i!=set[i];i=set[i]);
while(x!=i)
{
int temp=set[x];
set[x]=i;
x=temp;
}
return i;
}
bool up_match(int x,int y)
{
if(maze[x][y]=='C'||maze[x][y]=='D'||maze[x][y]=='E'||maze[x][y]=='H'||maze[x][y]=='I'||maze[x][y]=='J'||maze[x][y]=='K')
return true;
else
return false;
}
bool down_match(int x,int y)
{
if(maze[x][y]=='A'||maze[x][y]=='B'||maze[x][y]=='E'||maze[x][y]=='G'||maze[x][y]=='H'||maze[x][y]=='J'||maze[x][y]=='K')
return true;
else
return false;
}
bool left_match(int x,int y)
{
if(maze[x][y]=='B'||maze[x][y]=='D'||maze[x][y]=='F'||maze[x][y]=='G'||maze[x][y]=='I'||maze[x][y]=='J'||maze[x][y]=='K')
return true;
else
return false;
}
bool right_match(int x,int y)
{
if(maze[x][y]=='A'||maze[x][y]=='C'||maze[x][y]=='F'||maze[x][y]=='G'||maze[x][y]=='H'||maze[x][y]=='I'||maze[x][y]=='K')
return true;
else
return false;
}
void function(int x,int y)
{
if(maze[x][y]=='A')
{
if(x-1>=0)
{
if(up_match(x-1,y))
{
int fx=find(x*m+y);
int fy=find((x-1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(y-1>=0)
{
if(left_match(x,y-1))
{
int fx=find(x*m+y);
int fy=find(x*m+y-1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
}
if(maze[x][y]=='B')
{
if(x-1>=0)
{
if(up_match(x-1,y))
{
int fx=find(x*m+y);
int fy=find((x-1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(y+1<n)
{
if(right_match(x,y+1))
{
int fx=find(x*m+y);
int fy=find(x*m+y+1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
}
if(maze[x][y]=='C')
{
if(x+1<m)
{
if(down_match(x+1,y))
{
int fx=find(x*m+y);
int fy=find((x+1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(y-1>=0)
{
if(left_match(x,y-1))
{
int fx=find(x*m+y);
int fy=find(x*m+y-1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
}
if(maze[x][y]=='D')
{
if(x+1<m)
{
if(down_match(x+1,y))
{
int fx=find(x*m+y);
int fy=find((x+1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(y+1<n)
{
if(right_match(x,y+1))
{
int fx=find(x*m+y);
int fy=find(x*m+y+1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
}
if(maze[x][y]=='E')
{
if(x-1>=0)
{
if(up_match(x-1,y))
{
int fx=find(x*m+y);
int fy=find((x-1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(x+1<m)
{
if(down_match(x+1,y))
{
int fx=find(x*m+y);
int fy=find((x+1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
}
if(maze[x][y]=='F')
{
if(y-1>=0)
{
if(left_match(x,y-1))
{
int fx=find(x*m+y);
int fy=find(x*m+y-1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(y+1<n)
{
if(right_match(x,y+1))
{
int fx=find(x*m+y);
int fy=find(x*m+y+1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
}
if(maze[x][y]=='G')
{
if(x-1>=0)
{
if(up_match(x-1,y))
{
int fx=find(x*m+y);
int fy=find((x-1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(y-1>=0)
{
if(left_match(x,y-1))
{
int fx=find(x*m+y);
int fy=find(x*m+y-1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(y+1<n)
{
if(right_match(x,y+1))
{
int fx=find(x*m+y);
int fy=find(x*m+y+1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
}
if(maze[x][y]=='H')
{
if(x-1>=0)
{
if(up_match(x-1,y))
{
int fx=find(x*m+y);
int fy=find((x-1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(x+1<m)
{
if(down_match(x+1,y))
{
int fx=find(x*m+y);
int fy=find((x+1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(y-1>=0)
{
if(left_match(x,y-1))
{
int fx=find(x*m+y);
int fy=find(x*m+y-1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
}
if(maze[x][y]=='I')
{
if(x+1<m)
{
if(down_match(x+1,y))
{
int fx=find(x*m+y);
int fy=find((x+1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(y-1>=0)
{
if(left_match(x,y-1))
{
int fx=find(x*m+y);
int fy=find(x*m+y-1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(y+1<n)
{
if(right_match(x,y+1))
{
int fx=find(x*m+y);
int fy=find(x*m+y+1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
}
if(maze[x][y]=='J')
{
if(x-1>=0)
{
if(up_match(x-1,y))
{
int fx=find(x*m+y);
int fy=find((x-1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(x+1<m)
{
if(down_match(x+1,y))
{
int fx=find(x*m+y);
int fy=find((x+1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(y+1<n)
{
if(right_match(x,y+1))
{
int fx=find(x*m+y);
int fy=find(x*m+y+1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
}
if(maze[x][y]=='k')
{
if(x-1>=0)
{
if(up_match(x-1,y))
{
int fx=find(x*m+y);
int fy=find((x-1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(x+1<m)
{
if(down_match(x+1,y))
{
int fx=find(x*m+y);
int fy=find((x+1)*m+y);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(y-1>=0)
{
if(left_match(x,y-1))
{
int fx=find(x*m+y);
int fy=find(x*m+y-1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
if(y+1<n)
{
if(right_match(x,y+1))
{
int fx=find(x*m+y);
int fy=find(x*m+y+1);
if(fx<fy)
{
set[fy]=fx;
}
else
{
set[fx]=fy;
}
}
}
}
}
int main()
{
while(scanf("%d %d",&m,&n)!=EOF)
{
if(m==-1 && n==-1)
break;
for(int i=0;i<m;i++)//不是n,,,m,n搞反了
scanf("%s",maze[i]);
for(int i=0;i<10000;i++)
set[i]=i;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
function(i,j);
int ans=0;
for(int i=0;i<m*n;i++)
if(set[i]==i)
ans++;
printf("%d\n",ans);
}
//system("pause");
return 0;
}