http://acm.hdu.edu.cn/showproblem.php?pid=1241
整体思路就是扫描每一个map中字符,当然遇到'*'和已标记过的,也就是已走过的跳过,把sum传入函数中,把连同的区域都标记为当前的sum。
#include<stdio.h>
#include<string.h>
#define MAX 100
char map[MAX+10][MAX+10];
int judge[MAX+10][MAX+10];//标记
int N,M/*N行M列*/,sum;
void DFS(int X,int Y,int J)
{
int i,j,x,y;
for(i=-1;i<=1;i++)
{
for(j=-1;j<=1;j++)
{
if(i==0&&j==0) continue;//先排除在原位置的情况/*排除走一步以后不能到达的情况*/
x=X+j;
y=Y+i;
if(x>=0&&x<=N-1&&y>=0&&y<=M-1&&!judge[x][y]&&map[x][y]!='*')//当下一步可以走同时/*1.不越界 2.不走已标记的路 3.不走不通的路
{
judge[x][y]=J;
DFS(x,y,sum);
}
}
}
}
int main()
{
int i,j,k;
while(scanf("%d %d",&N,&M)&&(N||M))
{
memset(judge,0,sizeof(judge));
for(i=0;i<N;i++)
scanf("%s",map[i]);
sum=0;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(map[i][j]!='*'&&judge[i][j]==0)
DFS(i,j,++sum);
printf("%d\n",sum);
}
return 0;
}
DFS函数里的判断
void DFS(int X,int Y,int ...)
{
int i,j,x,y;
for(i=-1;i<=1;i++)
for(j=-1;j<=1;j++)
{
/*1.如果只能走上下左右*/
if(!(i==-1&&j==0||i==0&&j==-1||i==0&&j==1||i==1&&j==0)) continue;
//排除除上下左右以外的其他所有组合
/*2.如果上下左右和对角都能走*/
if(i==0&&j==0) continue;
//先排除在原位置的情况,也就是走一步以后只有原位置不能到达
x=X+j;//注意这里是X+j
y=Y+i;//注意这里是Y+i;
if(x>=0&&x<=N-1&&y>=0&&y<=M-1&&!judge[x][y]&&map[x][y]!='*')
{ //当下一步可以走同时/*1.不越界 2.不走已标记的路 3.不走不通的路
sum+=1//能走一步就加一
DFS(x,y,sum);
}
}
}