Lake counting

題目

Lake counting

簡單翻譯一下,一塊被劃分為N*M小塊的田地,因?yàn)檫B續(xù)降雨導(dǎo)致部分小塊出現(xiàn)積水,有積水的小塊用“W”標(biāo)記,沒有積水的小塊用“.”標(biāo)記。一個小塊與周圍的8個小塊都屬于相鄰狀態(tài),連續(xù)相鄰積水的小塊組成一個池塘。問給出的標(biāo)記后的田地一共有多少池塘?
上圖中的田地,一共有3塊池塘,左上角相鄰的“W”組成一塊,左下角相鄰的“W”組成一塊,右邊的一條“W”組成一塊。

解析

上面的二維數(shù)組表示的是一個圖結(jié)構(gòu)。我們從某一個“W”節(jié)點(diǎn)開始進(jìn)行深度遍歷,如果遇到“.”跳過,如果遇到“W”,改為“.”后(防止之后再一次的遍歷,保證只遍歷一次),繼續(xù)對這個點(diǎn)進(jìn)行深度遍歷,這樣得到的結(jié)果就是從起始的“W”節(jié)點(diǎn)開始,深度遍歷周圍的全部“W”節(jié)點(diǎn),這些節(jié)點(diǎn)被包圍的“.”節(jié)點(diǎn)阻斷,此時就是一個池塘。接下來尋找下一個“W”節(jié)點(diǎn),由于上一個“W”節(jié)點(diǎn)相鄰的“W”節(jié)點(diǎn)都被置成“.”節(jié)點(diǎn),所以這一個“W”節(jié)點(diǎn)一定屬于另外的一個池塘。重復(fù)著上面的步驟,就可以找到所有的池塘,統(tǒng)計個數(shù)。

代碼

public class LakeCounting {
    //行數(shù)
    private int N;
    //列數(shù)
    private int M;

    public LakeCounting(int n, int m) {
        N = n;
        M = m;
    }

    //深度遍歷
    public void DFS(String[][] field, int i, int j){
        //如果訪問數(shù)據(jù)越界,直接返回
        if (i < 0 || j < 0){
            return;
        }
        if (i >= N || j >= M){
            return;
        }
        //如果節(jié)點(diǎn)為“.”,跳過
        if (field[i][j].equals(".")){
            return;
        }
        //如果節(jié)點(diǎn)為“W”
        if (field[i][j].equals("W")){
            //置為“.”
            field[i][j] = ".";
            //遞歸深度遍歷8個相鄰的節(jié)點(diǎn)
            //upper left corner
            DFS(field, i - 1, j - 1);
            //upper
            DFS(field, i - 1, j);
            //upper right corner
            DFS(field, i - 1, j + 1);
            //left
            DFS(field, i, j -1);
            //right
            DFS(field, i, j + 1);
            //lower left corner
            DFS(field, i + 1, j -1);
            //lower
            DFS(field, i + 1, j);
            //lower right corner
            DFS(field, i + 1, j + 1);
        }
    }

    public static void main(String[] args){
        int count = 0;
        LakeCounting counting = new LakeCounting(10, 12);
        String[][] field = {
                {"W",".",".",".",".",".",".",".",".","W","W","."},
                {".","W","W","W",".",".",".",".",".","W","W","W"},
                {".",".",".",".","W","W",".",".",".","W","W","."},
                {".",".",".",".",".",".",".",".",".","W","W","."},
                {".",".",".",".",".",".",".",".",".","W",".","."},
                {".",".","W",".",".",".",".",".",".","W",".","."},
                {".","W",".","W",".",".",".",".",".","W","W","."},
                {"W",".","W",".","W",".",".",".",".",".","W","."},
                {".","W",".","W",".",".",".",".",".",".","W","."},
                {".",".","W",".",".",".",".",".",".",".","W","."}};
        //遍歷圖的二維數(shù)組
        for (int i = 0; i < 10; i++){
            for (int j = 0; j < 12; j++){
                //如果是“W”節(jié)點(diǎn),進(jìn)行深度遍歷
                if (field[i][j].equals("W")){
                    //池塘數(shù)+1
                    count++;
                    //遞歸的深度遍歷,
                    //會把與當(dāng)前“W”節(jié)點(diǎn)相鄰和拓展后相鄰的所有“W”節(jié)點(diǎn)都訪問到
                    //組成一個池塘
                    counting.DFS(field, i, j);
                }
            }
        }
        System.out.println("count = " + count);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 鏈接:https://www.luogu.com.cn/problem/P1596 題目描述 由于近期的降雨,雨水...
    quliikay閱讀 289評論 0 0
  • 1)這本書為什么值得看: Python語言描述,如果學(xué)的Python用這本書學(xué)數(shù)據(jù)結(jié)構(gòu)更合適 2016年出版,內(nèi)容...
    孫懷闊閱讀 12,899評論 0 15
  • 1.vector中resize() 和 reserve() 函數(shù)的區(qū)別? reserve 容器預(yù)留空間 ,但并不真...
    azubi閱讀 1,241評論 0 0
  • 漸變的面目拼圖要我怎么拼? 我是疲乏了還是投降了? 不是不允許自己墜落, 我沒有滴水不進(jìn)的保護(hù)膜。 就是害怕變得面...
    悶熱當(dāng)乘涼閱讀 4,480評論 0 13
  • 感覺自己有點(diǎn)神經(jīng)衰弱,總是覺得手機(jī)響了;屋外有人走過;每次媽媽不聲不響的進(jìn)房間突然跟我說話,我都會被嚇得半死!一整...
    章魚的擁抱閱讀 2,386評論 4 5

友情鏈接更多精彩內(nèi)容