洪水填充问题-dfs与bfs实现

洪水填充从一个点位向邻居点位扩散,然后再扩散到邻居的邻居,实际是一个寻找连通块的过程

洪水填充过程符合BFS原理,但用DFS实现更容易

如果用DFS,我们知道他会一条路走到底然后再回溯,这样我们就可以再一开始设置变量,来记录遍历的连通块的数量,并且记录这块连通块的数量

伪代码

对于起点,再主函数调用DFS(起点x坐标,起点y坐标)

函数实现:

牢记;DFS的一条路走到底,回溯走其他路,我们只要维护一个变量,这样我们可以遍历所有点,

DFS(x,y){

将x,y标记

res++

for(){//枚举四周的点

判断是否超出边界或被标记过

条件符合则DFS()递归

return res;//这样最终会返回所有数量

}                                                                                                                                                                                                                                                                                                                     例题

1113. 红与黑

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。

你站在其中一块黑色的瓷砖上,只能向相邻(上下左右四个方向)的黑色瓷砖移动。

请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入格式

输入包括多个数据集合。

每个数据集合的第一行是两个整数 WW 和 HH,分别表示 xx 方向和 yy 方向瓷砖的数量。

在接下来的 HH 行中,每行包括 WW 个字符。每个字符表示一块瓷砖的颜色,规则如下

1)‘.’:黑色的瓷砖;
2)‘#’:红色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。

当在一行中读入的是两个零时,表示输入结束。

输出格式

对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

数据范围

1≤W,H≤20

代码实现:



import java.util.Scanner;
import java.io.*;

class Main{


    static int N=25;
    static char map[][]=new char[N][N];
    static int n;
    static int m;



    static final BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) throws IOException {
        while(true){

            String[] s=cin.readLine().split(" ");
            int m=Integer.parseInt(s[0]);
            int n=Integer.parseInt(s[1]);
            if(m==0&&n==0)break;
            int x=0;
            int y=0;
            for(int i=0;i<n;i++){
                String str=cin.readLine();
                for(int j=0;j<m;j++){
                    map[i][j]=str.charAt(j);
                    if(map[i][j]=='@'){
                        x=i;
                        y=j;
                    }

                }
            }
            System.out.println(dfs(n,m,x,y));
        }
    }
    static int[] qqq={1,0,-1,0};
    static int[] www={0,1,0,-1};
    static int  dfs(int l,int r,int a,int b){//长,宽,起点x坐标,起点y坐标
    //将这个点计入,
        int resss=1;
        map[a][b]='#';
        //对四周进行枚举
        for(int i=0;i<4;i++){
            int aa=a+qqq[i];
            int bb=b+www[i];
            if(aa>=0&&aa<l&&bb>=0&&bb<r&&map[aa][bb]!='#'){
                resss+=dfs(l,r,aa,bb);
            }
        }
        return resss;
    }




}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值