解题思路:其实递归与上一题红与黑DFS方法求解的思路基本一致,只是这里的解法更能反映递归的特质,我觉得会更有利于帮助我们理解递归从而更自如地运用递归(经测试,耗时相同的情况下代码量也相对少一些)。如果遇到不是‘#’的符号,return 1+f(x+1,y)_f(x-1,y)+f(x,y+1)+f(x,y-1);返回1加上前后左右的计数值。出口条件是:1.越界,即超出限定的图形长度范围,return 0; 2.遇到‘#’,无法进一步计数,return 0;
下面直接给出代码:
#include<stdio.h>
#include<string.h>
int n,m; //行列数目
using namespace std;
char maze[21][21];
int f(int x, int y)
{
if(x>=m||y>=n||x<0||y<0) //这里一定要先判断是否出界,否则下面用到数组时会发生数组越界!
return 0;
else if(maze[x][y]=='#')
return 0;
else
{
maze[x][y]='#';
return 1+f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1);
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
{
break;
}
for(int i=0;i<m;i++)
{
scanf("%s",maze[i]);
}
int ans;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(maze[i][j]=='@')
{
//maze[i][j]='#';
ans=f(i,j);
break;
}
}
}
printf("%d\n",ans);
}
return 0;
}