码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ - 1709 Oil Deposits

时间:2014-07-18 16:19:41      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   for   

油田问题,有点像图像处理里的区域生长问题,找油田块数。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 }

ZOJ - 1709 Oil Deposits,布布扣,bubuko.com

ZOJ - 1709 Oil Deposits

标签:style   blog   color   os   io   for   

原文地址:http://www.cnblogs.com/BMESwimming/p/3851887.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!