HDU 1198 Farm Irrigation 广度优先搜索(DFS)

http://acm.hdu.edu.cn/showproblem.php?pid=1198

题意:(请进入上面链接)

题型:广搜

思路:我们可以用二维数组记下字母的位置,但是每个方块都有上,下,左,右四个部分,所以我们要另加一维,保存它四个方位的状态.然后逐个往下搜,只要是能连接的都将其标记,如果深搜之后都还没标记,说明它是另一块的,ans++直到最后结果就出来了.


#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cctype>
#include<iomanip>
#include<queue>

using namespace std;

int n,m;
int map[52][52][4];
int vis[52][52];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};

void DFS(int sx,int sy){
    for(int i=0;i<4;++i){
        int x=sx+dx[i];
        int y=sy+dy[i];
        if(x<0||y<0||x>=n||y>=m||vis[x][y])continue;
        int c;
        if(i==0)c=2; if(i==1)c=3; if(i==2)c=0; if(i==3)c=1;///相邻的位置
        if(map[sx][sy][i]&&map[x][y][c]){///相邻且相连接
            vis[x][y]=1;
            DFS(x,y);
        }
    }
}
int main(){
    while(cin>>n>>m){
        if(n<1||m<1)break;
        for(int i=0;i<n;++i){
            getchar();
            for(int j=0;j<m;++j){
                char g;cin>>g;
                for(int t=0;t<4;++t)map[i][j][t]=0;
                if(g=='A'||g=='B'||g=='E'||g=='G'||g=='H'||g=='J'||g=='K')map[i][j][0]=1;///上
                if(g=='B'||g=='D'||g=='F'||g=='G'||g=='I'||g=='J'||g=='K')map[i][j][1]=1;///右
                if(g=='C'||g=='D'||g=='E'||g=='H'||g=='I'||g=='J'||g=='K')map[i][j][2]=1;///下
                if(g=='A'||g=='C'||g=='F'||g=='G'||g=='H'||g=='I'||g=='K')map[i][j][3]=1;///左
            }
        }
        memset(vis,0,sizeof(vis));
        int ans=0;
        for(int i=0;i<n;++i)
            for(int j=0;j<m;++j){
                if(vis[i][j])continue;
                ans++;
                DFS(i,j);
            }
        cout<<ans<<endl;
    }
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值