原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1312
题目大意:
输入W和H表示有W列。H行。输入一个W * H的图。其中’#’表示此位置不能走,’.’表示此位置可以走。‘@’表示此处为起点。问最多可以走多少个‘.’
思路:
从记录的起点坐标开始,逐个遍历每个点。如果新的点满足条件就把值加一。不满足就继续搜索其他位置的点。
代码如下:
#include <iostream>
#include <cstdio>
char tile[25][25]; //用于存放图
using namespace std;
void begin( int a, int b, int x, int y, int& max )
{
// 四个方向的移动
int Xz[4]={-1,0,1,0};
int Yz[4]={0,1,0,-1};
int k,new_x,new_y;
for( k = 0; k < 4; k++)
{
new_x = x + Xz[k];
new_y = y + Yz[k];
//越界判定
if( new_x < 0 || new_x >= a || new_y < 0 || new_y >= b )
continue;
if( tile[new_x][new_y] == '#')
continue;
if( tile[new_x][new_y] == '.' )
{
max++;
tile[new_x][new_y] = '#';
begin(a,b,new_x,new_y,max);
}
}
}
int main()
{
while(1)
{
int a,b;
cin>>b>>a;
if( a == 0 && b == 0 )
break;
int x,y,i,j;
for( i = 0; i < a ; i++ )
for( j = 0; j < b; j++)
{
cin>>tile[i][j];
//记录起点坐标
if( tile[i][j] == '@' )
{
x = i;
y = j;
}
}
int max;
max = 1;
begin( a,b,x,y,max );
cout<<max<<endl;
}
return 0;
}