美文网首页
UVa572-DFS

UVa572-DFS

作者: 墨平语凡 | 来源:发表于2017-11-03 20:05 被阅读0次
public class UVa572 {
    Scanner scanner = new Scanner(System.in);
    char[][] pic = null;
    int[][] idx = null;
    int m = 0;
    int n = 0;
    void run(){
        while(scanner.hasNextLine()){
            //获取m n的值, c++中scanf("%d,%d", &m, &n)解决
            String mn = scanner.nextLine();
            String[] mnSplit = mn.split(" ");
             m = Integer.parseInt(mnSplit[0]);
             n = Integer.parseInt(mnSplit[1]);
            //输入不合法时退出
            if(m==0) break;
            if(m<1||m>100||n<1||n>100) break;
            pic = new char[m][n];
            idx = new int[m][n];        //初始化idx, 所有初始值默认为0
            //字符串变字符数组
            for (int i = 0; i < m; i++) {
                pic[i]=scanner.nextLine().toCharArray();
            }
            int cnt = 0;
            for (int i = 0; i < m ; i++) {
                for (int j = 0; j < n; j++) {
                    if(idx[i][j]==0 && pic[i][j] == '@')
                        dfs(i,j,++cnt);
                }
            }
            System.out.println(cnt);
        }
    }
    void dfs(int r, int c, int id) {
        if (r < 0 || r >= m || c < 0 || c >= n) return;     //出界的格子
        if (idx[r][c] > 0 || pic[r][c] != '@') return;      //不是"@"或者已经访问过的格子
        idx[r][c] = id;     //连通分量编号
        for (int dr = -1; dr <= 1; dr++)        //访问四周是否存在连通的格子
            for (int dc = -1; dc <= 1; dc++)
                if (dr != 0 || dc != 0)         //自身格子不重复判断
                    dfs(r + dr, c + dc, id);
    }
    public static void main(String[] args){
        new UVa572().run();
    }

}

相关文章

网友评论

      本文标题:UVa572-DFS

      本文链接:https://www.haomeiwen.com/subject/ackxmxtx.html