zoj 1709 Oil Deposits

千淘万漉虽辛苦,吹尽狂沙始AC啊,这道题经过慎重的分析之后,思路应该是相当清晰,可写代码时没有注意把定义过的全局变量在主函数中又定义了一次,结果输出总是有误,把主函数中的定义删去,立竿见影,一下AC,我也很是迷茫啊,谁能帮忙解释一下的话万分感激;这也算是我才开始写的DFS,回顾一下我的原理:在标志数组中把相连的油井赋值为1;进行几次DFS赋值就有几块油井,感觉还行吧可怜

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #define M 100 int flag[M+10][M+10]={0}; //标志数组(抽象出来的0,1用数组) char s[M+10][M+10]; //读入字符用 int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{-1,-1},{1,1},{1,-1},{-1,1}};//方向数组 int m,n; void dfs(int x,int y) //深搜 { flag[x][y] = 1; //赋值标记,属于某一被探过的一块 int i; for(i=0;i<8;i++) { int tx = x + dir[i][0]; int ty = y + dir[i][1]; if(tx>=0&&tx<m && ty>=0&&ty<n && flag[tx][ty]==0 && s[tx][ty]=='@') //深搜条件(不出界,未被探过,且是油井) { dfs(tx,ty); //深搜的递归调用 } } } int main() { int i,j,num; while(scanf("%d%d",&m,&n)==2,m*m+n*n) { for(i=0;i<m;i++) scanf("%s",s[i]); num = 0; //记录油井块数 memset(flag,0,sizeof(flag)); //标志数组的初始化,很重要的 for(i=0;i<m;i++) //遍历,找油井 for(j=0;j<n;j++) { if(s[i][j]=='@' && flag[i][j]==0) //对未探过的油井块标记 { dfs(i,j); num++; //油井块数即深搜次数 } } printf("%d\n",num); } return 0; }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值