百练oj2816:红与黑

总时间限制: 
1000ms 
内存限制: 
65536kB
描述
有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
输入
包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
1)‘.’:黑色的瓷砖;
2)‘#’:白色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
当在一行中读入的是两个零时,表示输入结束。
输出
对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。
样例输入
6 9 
....#. 
.....# 
...... 
...... 
...... 
...... 
...... 
#@...# 
.#..#. 
0 0
样例输出
45
来源

1979






代码:

#include
#include

#define MAX 30
char map[MAX][MAX];


int count(int px , int py){
	if( map[px][py] == '#' )
		return 0;
	else{
		map[px][py] = '#';
		return 1 + count(px-1,py) + count(px+1,py) + count(px,py+1) + count(px,py-1);
	}
}

int main(){
	int c,r;
	int i,j,px,py;

	while(1){
		scanf("%d %d",&c,&r);
		getchar();

		if( c == 0 )
			break;

		memset(map , '#' , 900);

		for( i = 1 ; i <= r ; i++ ){
			for( j = 1 ; j <= c ; j++)
				scanf("%c",&map[i][j]);
			getchar();
		}

		for( i = 1 ; i <= r ; i++ ){
			for( j = 1 ; j <= c ; j++ ){
				if( map[i][j] == '@' ){
					px = i;
					py = j;
				}
			}
		}
	

		printf("%d\n",count(px,py));
	}
	
	return 0;
}

思路是用map数组来存储地图,然后从@点出发,向四周计数。要用递归,如果一个黑点,则返回1 + 周围几个黑点递归下去遇到的黑点数,注意当数过一个黑点后要把那个点赋值为#,保证不会重复计数。因为可能有边界的问题,所以数组存储从(1,1)开始,要用memset()把map[]全部初始化为'#',这样返回值就可以用同一个公式而不用分类讨论。

你可能感兴趣的:(百练OJ天梯之路)