算法實踐:淨化迷霧森林(改編自紅與黑)

淨化迷霧森林(改編自紅與黑)

描述

迷霧森林被加農的玷污了,原本聖潔無比的迷霧森林,如今被徹底玷污,空氣中充滿着紫色的惡臭。

林克臨危不懼,帶上呼吸面罩,揮舞大師之劍的光芒,淨化迷霧。林克所到之處,加農褪去,聖潔迴歸。

如下圖,紅色代表牆壁,紫色的迷霧代表需要淨化的空間,金色代表林克開始淨化的起點。

從某處開始,林克只能向相鄰的紫色區域移動。請問,林克總共能夠淨化多少區域?

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kbmcWXni-1586405390333)(C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\image-20200409120810822.png)]

輸入

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-U7fBJy2e-1586405390334)(C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\image-20200409120828250.png)]

輸出

對每個數據集合,分別輸出一行,顯示林克從初始位置出發能淨化的迷霧數(記數時包括初始位置的迷霧)。

樣例

6 9 
....#. 
.....# 
...... 
...... 
...... 
...... 
...... 
#@...# 
.#..#. 
0 0
45

難度

中,標準深搜,不需要回溯

解法

對四個方向進行標準深搜

代碼

#include <bits/stdc++.h>
using namespace std;
#define MAX_W 20
#define MAX_H 20
// 待寫入的二維數組
int santified[MAX_W][MAX_H];
//存儲狀態
char fogForests[MAX_W][MAX_H];
//標準深搜
int W,H;  //邊界
int c=0;   //計數變量
void dfs(int x,int y){
    if(x<0||y<0||x>=H||y>=W)
        return ;
    if(fogForests[x][y]=='#' || santified[x][y])
        return ;
    c++;
    santified[x][y]=1;
    dfs(x-1,y);dfs(x+1,y);dfs(x,y-1);dfs(x,y+1);
}
//void print(){
//    for(int i=0;i<H;i++) {
//        for (int j = 0; j < W; j++)
//            cout << santified[i][j] << " ";
//        cout << endl;
//    }
//}
int main() {
    while(1) {
        cin >> W >> H;
        if (W == 0 && H == 0) break;
        memset(santified,0, sizeof(santified));
        int beginx,beginy;  //記錄起始位置
        for(int i=0;i<H;i++)
            for(int j=0;j<W;j++){
                cin>>fogForests[i][j];
                if(fogForests[i][j]=='@'){
                    beginx=i;beginy=j;
                }
            }
        c = 0;
        dfs(beginx,beginy);
//        cout<<endl;
//        cout<<beginx<<" "<<beginy<<" "<<santified[beginx][beginy];
//        cout<<endl;
//        print();
        cout<<c<<endl;
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章