首页 > 代码库 > ZOJ - 1709 Oil Deposits

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 }