ZOJ - 1709 Oil Deposits

油田问题,有点像图像处理里的区域生长问题,找油田块数。BFS,DFS都可以。

 1 /*BFS*/
 2 #include<stdio.h>
 3 #include<string.h>
 4 const int maxn=100+5,maxm=1000;
 5 int m,n,vis[maxn][maxn],mat[maxn][maxn],dir[10][3]={{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1}};
 6 char s[maxn][maxn];
 7 struct node{
 8     int xpos;
 9     int ypos;
10     void init(int x,int y)
11     {
12         xpos=x;ypos=y;
13     }
14 }que[maxm];
15 int bfs(void);
16 int main()
17 {
18     while(scanf("%d%d",&m,&n)==2 && m){
19         for(int i=0;i<m;i++)
20             scanf("%s",s[i]);
21         memset(mat,0,sizeof(mat));
22         for(int i=0;i<m;i++)
23         for(int j=0;j<n;j++){
24             if(s[i][j]=='@')
25                 mat[i][j]=1;
26         }
27         int ans=bfs();
28         printf("%d\n",ans);
29     }
30     return 0;
31 }
32 int bfs(void)
33 {
34     int totoil=0;
35     memset(vis,0,sizeof(vis));
36     for(int i=0;i<m;i++)
37     for(int j=0;j<n;j++){
38         if(!mat[i][j])
39             continue;
40         if(vis[i][j])
41             continue;
42         int head,tail;
43         que[head=tail=0].xpos=i;
44         que[tail++].ypos=j;
45         vis[i][j]=1;
46         totoil++;
47         while(head!=tail){
48             node a=que[head];
49             for(int i=0;i<8;i++){
50                 int nx=a.xpos+dir[i][0];
51                 int ny=a.ypos+dir[i][1];
52                 if(nx<0 || ny<0 || nx>=m || ny>=n)
53                     continue;
54                 if(vis[nx][ny])
55                     continue;
56                 if(!mat[nx][ny])
57                     continue;
58                 node c;
59                 c.init(nx,ny);
60                 que[tail]=c;
61                 tail=(tail+1)%maxm;
62                 vis[nx][ny]=1;
63             }
64             head=(head+1)%maxm;
65         }
66     }
67     return totoil;
68 }
 1 /*DFS代码量有所减少*/
 2 #include<stdio.h>
 3 #include<string.h>
 4 const int maxn=100+5;
 5 int m,n,vis[maxn][maxn],mat[maxn][maxn],dir[10][3]={{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1}};
 6 char s[maxn][maxn];
 7 //struct node{
 8 //    int xpos;
 9 //    int ypos;
10 //    void init(int x,int y)
11 //    {
12 //        xpos=x;ypos=y;
13 //    }
14 //}que[maxm];
15 int dfs(int x,int y);
16 int main()
17 {
18     while(scanf("%d%d",&m,&n)==2 && m){
19         int ans=0;
20         for(int i=0;i<m;i++)
21             scanf("%s",s[i]);
22         memset(mat,0,sizeof(mat));
23         memset(vis,0,sizeof(vis));
24         for(int i=0;i<m;i++)
25         for(int j=0;j<n;j++)
26             if(s[i][j]=='@')
27                 mat[i][j]=1;
28         for(int i=0;i<m;i++)
29         for(int j=0;j<n;j++){
30             if(!mat[i][j] || vis[i][j])
31                 continue;
32             ans+=dfs(i,j);
33         }
34         printf("%d\n",ans);
35     }
36     return 0;
37 }
38 int dfs(int x,int y)
39 {
40       if(vis[x][y]) return vis[x][y];
41       vis[x][y]=1;
42       for(int i=0;i<8;i++){
43           int nx=x+dir[i][0];
44           int ny=y+dir[i][1];
45           if(nx<0 || ny<0 || nx>=m || ny>=n)
46               continue;
47           if(vis[nx][ny])
48               continue;
49           if(!mat[nx][ny])
50               continue;
51            dfs(nx,ny);
52       }
53       return 1;
54 }

转载于:https://www.cnblogs.com/BMESwimming/p/3851887.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值