1. 程式人生 > >HNCU1103:紅與黑(DFS)

HNCU1103:紅與黑(DFS)

題目描述

小明站在一個矩形房間裡,這個房間的地面鋪滿了地磚,每塊地磚的顏色或是紅色或是黑色。小明一開始站在一塊黑色地磚上,並且小明從一塊地磚可以向上下左右四個方向移動到其他的地磚上,但是他不能移動到紅色地磚上,只能移動到黑色地磚上。
請你程式設計計算小明可以走到的黑色地磚最多有多少塊。

輸入格式

輸入包含多組測試資料。
每組輸入首先是兩個正整數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;
}