hdoj 1241 Oil Deposits



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);
	        }
           
         }   
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值