//迷宫maze[20][20]
//宽度W,高度H
//计数变量count
//方向数组x_dir,y_dir
#include<stdio.h>
char maze[20][20];
int W,H;
int count=0;
int x_dir[4]={0,0,-1,1},y_dir[4]={1,-1,0,0};
void dfs(int y,int x)
{
if(x>=W||y>=H||x<0||y<0) return ;
if(maze[y][x]=='#') return ;
count++;
maze[y][x]='#';
int t_x,t_y;
for(int k=0;k<4;k++)
{
t_x=x,t_y=y;
t_x+=x_dir[k];
t_y+=y_dir[k];
dfs(t_y,t_x);
}
}
int main()
{
while(scanf("%d %d",&W,&H)&&W+H)
{
int S_x,S_y;
for(int i=0;i<H;i++)
{
scanf("%s",maze[i]);
for(int j=0;j<W;j++)
{
if(maze[i][j]=='@')
{
S_x=j,S_y=i;
break;
}
}
}
dfs(S_y,S_x);
printf("%d\n",count);
count=0;
}
return 0;
}
方法:递归深度搜索,采用过点,点变墙
注意:起始的count的值;
注意W与x对应,H与y对应;
注意数组maze的下标与x,y的关系(此题解为y为一维下标,x为二维下标);
*注意递归函数中原变量在每次递归回来时是不变的
例如这样写递归函数:
<pre name="code" class="plain">void dfs(int y,int x)
{
if(x>=W||y>=H||x<0||y<0) return ;
if(maze[y][x]=='#') return ;
count++;
maze[y][x]='#';
int t_x,t_y;
t_x=x,t_y=y;
for(int k=0;k<4;k++)
{
t_x+=x_dir[k];
t_y+=y_dir[k];
dfs(t_y,t_x);
}
}
是不对的,这样写当测试坐标(i,j)的某个方向时且该方向不是最后一个方向的时候,如果满足不越界不碰墙的情况,那么在未遍历完该坐标(i,j)的上下左右四个方向,便已经使要遍历的坐标(i,j)变化;
修正错误:每次都要在for循环中对临时坐标进行赋原值,使其每次都为原坐标,从而达到只改变方向,使其完整遍历4个方向;
用scanf()与%s组合可以使代码忽略回车作为字符的影响,从而可以不用getchar();