HDU 1198 Farm Irrigation

不太一样的搜索水题

题意:
A–K对应不同水管 要事整个田地都能灌溉到水 ,问 需要到少水源

思路:
一开始想的就是深搜 只是方向都不同罢了 和求连通区域个数没什么区别 属于最水的搜索题

AC Code

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;
const int maxn=60;
char mat[maxn][maxn];
bool vis[maxn][maxn];
int row,col;
int dir[12][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}
};
int dx[]= {-1,0,1,0};
int dy[]= {0,1,0,-1};

bool judge(int x,int y)
{
    return x>0&&x<=row&&y>0&&y<=col&&!vis[x][y];
}

void dfs(int from,int x,int y)
{
    int num=mat[x][y]-'A',xx,yy;
    if(from<4)
        if(!dir[num][(from+2)%4]){vis[x][y]=false; return ;}
    for(int i=0; i<4; i++)
    {
        if(dir[num][i])
        {
            xx=x+dx[i];
            yy=y+dy[i];
            if(judge(xx,yy))
            {
                vis[xx][yy]=true;
                dfs(i,xx,yy);
            }
        }
    }
}

int main()
{
    while(scanf("%d%d",&row,&col),row>0&&col>0)
    {
        getchar();
        for(int i=1; i<=row; i++)
            scanf("%s",mat[i]+1);
        memset(vis,false,sizeof vis);
        int ans=0;
        for(int i=1; i<=row; i++)
            for(int j=1; j<=col; j++)
                if(!vis[i][j])
                {
                    ans++;
                    vis[i][j]=true;
                    dfs(maxn,i,j);
                }
        printf("%d\n",ans);
    }
    return 0;
}