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

油田合并

时间:2016-05-18 21:39:03      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

油田合并

TimeLimit: 1 Second   MemoryLimit: 32 Megabyte

Totalsubmit: 603   Accepted: 166  

Description

某石油公司发现了一个油田。该油田由n*m个单元组成的矩形,有些单元里有石油,有些则没有。单元油田可以通过上,下,左或右连通。在一个单元油田里架设一台采油机,它可以把和该单元油田相连的单元油田的石油采完。该公司想知道最少需要架设几台采油机能把所有的石油采完?

Input

先输入2个正整数n,m(1<=n,m<=50)。接着有n行,每行有m个字符。‘@‘表示该单元有石油,‘*‘则表示该单元没有石油。 输入到文件结束。

Output

对于每组测试,输出最少需要架设几台采油机。

Sample Input

2 2

@*

*@

2 2

@@

@@

Sample Output

2 1

BFS:

技术分享
 1 /*简单BFS搜索*/
 2 #include<cstdio>
 3  #include<queue>
 4  #include<cstring>
 5 
 6 
 7 using namespace std;
 8 
 9 struct Q{
10         int x,y;
11  };
12 
13 int dir[4][2]={1,0,-1,0,0,1,0,-1};   
14  char map[105][105];
15  char str[105];
16 
17 void bfs(int a,int b,int n,int m){
18     int i,x,y;
19     queue<Q> q;
20     Q now,temp;
21     temp.x=a;
22     temp.y=b;
23     map[a][b]=*;
24     q.push(temp);
25     while(!q.empty()){
26        now=q.front();
27        q.pop();
28        for(i=0;i<4;i++){   
29            x=now.x+dir[i][0];
30            y=now.y+dir[i][1];
31            if(x<1||x>n||y<1||y>m||map[x][y]==*)
32                continue;
33            temp.x=x;
34            temp.y=y;
35            map[x][y]=*;
36            q.push(temp);
37        }
38     }
39  }
40 
41 int main(){
42      int i,j,n,m,count;
43      while(~scanf("%d%d",&n,&m)&&m){
44        count=0;
45        for(i=1;i<=n;i++){
46          scanf("%s",str);
47          for(j=1;j<=m;j++)
48          map[i][j]=str[j-1];
49        }
50        for(i=1;i<=n;i++)
51          for(j=1;j<=m;j++)
52            if(map[i][j]==@){     
53               bfs(i,j,n,m);
54               count++;
55            }
56        printf("%d\n",count);
57     }
58     return 0;
59  }
View Code


DFS:

技术分享
 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int N=55;
 5 int n,m;
 6 char s[N][N];
 7 int vist[N][N];
 8 int dir[][2]={-1,0,0,1,1,0,0,-1};//代表上下左右四个方向
 9 void dfs(int x,int y)
10 {
11     vist[x][y]=1;
12     for(int d=0;d<4;++d)
13     {
14         int nx=x+dir[d][0];
15         int ny=y+dir[d][1];
16         if(nx<=n&&s[nx][ny]==@&&vist[nx][ny]==0)
17         {
18             dfs(nx,ny);
19         }
20     }
21 }
22 int main()
23 {
24     while(cin>>n>>m)
25     {
26         int sum=0;
27         memset(vist,0,sizeof(vist));
28         for(int i=1;i<=n;++i)
29         {
30             for(int j=1;j<=m;++j)
31             {
32                 cin>>s[i][j];
33             }
34         }
35         for(int i=1;i<=n;++i)
36         {
37             for(int j=1;j<=m;++j)
38             {
39                 if(vist[i][j]==0&&s[i][j]==@)
40                 {
41                     ++sum;
42                     dfs(i,j);
43                 }
44             } 
45         }
46         cout<<sum<<endl;
47     }
48     return 0;
49 }
View Code

 

 

油田合并

标签:

原文地址:http://www.cnblogs.com/qinduanyinghua/p/5506549.html

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