淨化迷霧森林(改編自紅與黑)
描述
迷霧森林被加農的玷污了,原本聖潔無比的迷霧森林,如今被徹底玷污,空氣中充滿着紫色的惡臭。
林克臨危不懼,帶上呼吸面罩,揮舞大師之劍的光芒,淨化迷霧。林克所到之處,加農褪去,聖潔迴歸。
如下圖,紅色代表牆壁,紫色的迷霧代表需要淨化的空間,金色代表林克開始淨化的起點。
從某處開始,林克只能向相鄰的紫色區域移動。請問,林克總共能夠淨化多少區域?
輸入
輸出
對每個數據集合,分別輸出一行,顯示林克從初始位置出發能淨化的迷霧數(記數時包括初始位置的迷霧)。
樣例
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;
}