相聚 桂林电子科技大学第三届ACM程序设计竞赛

题目链接:https://ac.nowcoder.com/acm/contest/558/D

  就是求有多少块区域,用DFS就可以解决,一遇到一个1就从其开始深搜,将其所在的区域块覆灭(变为0),再遇到一个1,重复此操作。

Accept

import java.util.Scanner;

public class Main {
    
    static int old=0;
    static int N;
    static int M;
    static char array[][];
    static int x[]={-1,0,1,0};    //上左下右
    static int y[]={0,1,0,-1};
    
    static void solve(char array[][],int i,int j){
        array[i][j]='0';
        for(int d=0;d<4;d++){
            int dx=i+x[d];
            int dy=j+y[d];
            if(dx<0 || dy<0 || dx>N-1 || dy>M-1){    //越界判断
                continue;
            }
            if(array[dx][dy]=='1'){    //深搜覆盖这个岛屿
                array[dx][dy]='0';
                solve(array,dx,dy);
            }
        }
    }

    public static void main(String[] args){
        Scanner reader=new Scanner(System.in);
        int T=reader.nextInt();
        while(T>=1){
             old=0;
             N=reader.nextInt();
             M=reader.nextInt();
             array=new char[N][M];
             for(int i=0;i<N;i++){
                 String s=reader.next();
                 array[i]=s.toCharArray();
             }
//             for(int i=0;i<N;i++){
//                 for(int j=0;j<M;j++){
//                     System.out.print(array[i][j]);
//                 }
//                 System.out.println();
//             }
             //第一次扫描
             for(int i=0;i<N;i++){
                 for(int j=0;j<M;j++){
                     if(array[i][j]=='1'){
                         old++;
                         solve(array,i,j);
                     }
                 }
             }
            
             System.out.println(old);
             T--;
        }
    }
}
posted @ 2019-04-14 22:11  一转身已万水千山  阅读(293)  评论(0编辑  收藏  举报