HNCU1103:紅與黑(DFS)
阿新 • • 發佈:2018-12-23
題目描述
小明站在一個矩形房間裡,這個房間的地面鋪滿了地磚,每塊地磚的顏色或是紅色或是黑色。小明一開始站在一塊黑色地磚上,並且小明從一塊地磚可以向上下左右四個方向移動到其他的地磚上,但是他不能移動到紅色地磚上,只能移動到黑色地磚上。
請你程式設計計算小明可以走到的黑色地磚最多有多少塊。
輸入格式
輸入包含多組測試資料。
每組輸入首先是兩個正整數W和H,分別表示地磚的列行數。(1<=W,H<=20)
接下來H行,每行包含W個字元,字元含義如下:
‘.’表示黑地磚;
‘#’表示紅地磚;
‘@’表示小明一開始站的位置,此位置是一塊黑地磚,並且這個字元在每組輸入中僅會出現一個。
當W=0,H=0時,輸入結束。
輸出
對於每組輸入,輸出小明可以走到的黑色地磚最多有多少塊,包括小明最開始站的那塊黑色地磚。
樣例輸入
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#[email protected]#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
[email protected]
###.###
..#.#..
..#.#..
0 0
樣例輸出
45
59
6
13
#include<cstdio> int dis[4][2]={{1,0},{0,1},{0,-1},{-1,0}}; char ci[21][21]; int w,h,s; void dfs(int x,int y){ int nx,ny,k; s++; ci[x][y]='#';//標記走過的路 防止重複搜 for( k=0;k<4;k++){ nx=x+dis[k][0]; ny=y+dis[k][1]; if(nx>=0&&ny>=0&&nx<h&&ny<w&&ci[nx][ny]=='.')//判斷的是標記後的下一個位置屬性 dfs(nx,ny);//若能繼續搜 則繼續搜 否則退回前一個座標,繼續搜 //相當與能dfs就入棧,不能就出棧,再操作棧頂元素(繼續搜) // 所以nx ny始終等於能繼續往下搜才進行上下左右操作; } return; } int main(){ while(scanf("%d%d",&w,&h)&&(w||h)){ s=0; for( int i=0;i<h;i++) scanf("%s",ci[i]); for( int i=0;i<h;i++) for(int j=0;j<w;j++) if(ci[i][j]=='@') dfs(i,j); printf("%d\n",s); } return 0; }
//////////辦法2
//原始碼源於網路 稍加修改
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=20+5;
const int dx[4]={1,0,-1,0};
const int dy[4]={0,1,0,-1};
bool a[maxn][maxn],vis[maxn][maxn];
int w,h,ans=0;
bool can(int xx,int yy)
{
if (xx<1||xx>h||yy<1||yy>w||!a[xx][yy]||vis[xx][yy]) return false;
return true;
}
void dfs(int xx,int yy)
{
vis[xx][yy]=true;//標記走過的路
ans++;
for (int i=0;i<4;i++)
{
xx+=dx[i];
yy+=dy[i];
if (can(xx,yy)) //每次判斷的是下一個位置是否能搜,即vis為false 所以想要回到前一個位置繼續判斷需要進行1,2操作,而辦法1則不同
dfs(xx,yy);
xx-=dx[i]; //1
yy-=dy[i]; //2
}
return;
}
int main()
{
char ch;
int xx,yy;
while(scanf("%d%d",&w,&h)==2&&w)
{
ans=0;
memset(a,0,sizeof(a));//清空陣列
memset(vis,0,sizeof(vis));//清空陣列
scanf("%c",&ch);
for (int i=1;i<=h;i++)
{
for (int j=1;j<=w;j++)
{
scanf("%c",&ch);
if (ch=='.') a[i][j]=1;
else if (ch=='@')
{
xx=i;
yy=j;
}
}
scanf("%c",&ch);
}
dfs(xx,yy);
printf("%d\n",ans);
}
return 0;
}