水洼数dfs(java)

问题描述:

有一个大小为 N×M 的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出 园子里总共有多少水洼?
*限制条件N, M ≤ 100
样例:输入 N=10, M=12园子如下图
('W’表示积水, '.'表示没有积水)
W…WW.
.WWW…WWW
…WW…WW.
…WW.
…W…
…W…W…
.W.W…WW.
W.W.W…W.
.W.W…W.
…W…W.
输出 3

代码如下(具体看注释)

import java.util.Scanner;
public class Sw {
    //水洼数目
    public static void Swxc(char [][]a,int i,int j)//将水洼变为旱地,避免死循环
    {
         a[i][j]='.';//将水洼变为旱地
         //分别向八个方向dfs
//         if (j-1>=0&&a[i][j-1]=='W') Swxc(a,i,j-1);
//         if (i-1>=0&&a[i-1][j]=='W')Swxc(a,i-1,j);
//         if (j+1<=a[0].length-1&&a[i][j+1]=='W')Swxc(a,i,j+1);
//         if (i+1<=a.length-1&&a[i+1][j]=='W')Swxc(a,i+1,j);
//         if (j-1>=0&&i-1>=0&&a[i-1][j-1]=='W') Swxc(a,i-1,j-1);
//         if (j+1<=a[0].length-1&&i-1>=0&&a[i-1][j+1]=='W') Swxc(a,i-1,j+1);
//         if (j-1>=0&&i+1<=a.length-1&&a[i+1][j-1]=='W') Swxc(a,i+1,j-1);
//         if (j+1<=a[0].length-1&&i+1<=a.length-1&&a[i+1][j+1]=='W') Swxc(a,i+1,j+1);
         for (int s=-1;s<=1;s++)//简便方法八连通
         {
             for(int t=-1;t<=1;t++)
             {
                 if (s==0&&t==0) continue;
                 if (i+s>=0&&i+s<=a.length-1&&j+t>=0&&j+t<=a[0].length-1)
                    if (a[i+s][j+t]=='W')
                        Swxc(a,i+s,j+t);
             }
         }
    }
    public static void main(String[] args) {
        Scanner a=new Scanner(System.in);//输入数据
        int count=0;//计数
        int b=a.nextInt();
        int c=a.nextInt();
        char [][]d=new char[b][c];
        for (int i=0;i<=b-1;i++)
            d[i]=a.nextLine().toCharArray();
        for (int i=0;i<=d.length-1;i++)//循环找到第一个水洼
        {
            for (int j = 0; j <= d[0].length - 1; j++) {
                if (d[i][j] == 'W')
                {
                    Swxc(d, i, j);
                    count++;//计数加一次,说明是一个水洼
                }
            }
        }
        System.out.println(count);
    }
}

你可能感兴趣的:(水洼数dfs(java))