农田灌溉
题目大意:
有11种田地,每种田地中都有不同的管道,可以在田地中央设水源。如果田地间管道畅通,水可以灌溉到该田地。问用最少用几个水源就可以灌溉整片农田。
解题思路:
深搜。好像并查集也可以,这里就用深搜啦~把每个田地的上右下左方向标记成1或0,1表示有管道口,0表示没有。
AC代码:
#include <stdio.h>
#include <string.h>
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//上右下左
int pip[11][4]={{1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0},{1,0,1,0},{0,1,0,1},{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,0},{1,1,1,1}};
char map[50][50];
int mark[50][50],m,n,count;
void dfs(int i,int j)
{
int x,y,k;
mark[i][j]=1;
for(k=0;k<4;k++)
{
x=dir[k][0]+i;
y=dir[k][1]+j;
if(!mark[x][y]&&x>=0&&x<m&&y>=0&&y<n&&pip[map[i][j]][k]==1&&pip[map[x][y]][(k+2)%4]==1)
dfs(x,y);
}
}
int main()
{
int i,j;
while(scanf("%d%d",&m,&n),n>=0&&m>=0)
{
memset(mark,0,sizeof(mark));
for(i=0;i<m;i++)
{
//scanf("%s",map[i]);
getchar();
for(j=0;j<n;j++)
{
scanf("%c",&map[i][j]);
map[i][j]-='A';
}
}
count=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(!mark[i][j])
{
dfs(i,j);
count++;
}
}
printf("%d\n",count);
}
return 0;
}