hdoj 1241 Oil Deposits

来源:互联网 发布:js body append html 编辑:程序博客网 时间:2024/06/06 20:44


http://acm.hdu.edu.cn/showproblem.php?pid=1241

整体思路就是扫描每一个map中字符,当然遇到'*'和已标记过的,也就是已走过的跳过,把sum传入函数中,把连同的区域都标记为当前的sum。

#include<stdio.h>#include<string.h>#define MAX 100char 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
原创粉丝点击