油田合并
油田合并
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 }
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 }
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <fstream> 5 using namespace std; 6 7 const int N = 50; 8 9 char s[N][N]; 10 bool visit[N][N]; 11 12 int dx[] = {-1, 0, 1, 0}; 13 int dy[] = {0, 1, 0, -1}; 14 int n, m; 15 16 void dfs(int x, int y){ 17 visit[x][y] = 1; 18 for(int i = 0; i < 4; i++){ 19 int nx = x + dx[i]; 20 int ny = y + dy[i]; 21 if(nx >= 0 && nx < n && ny >= 0 && ny < m && visit[nx][ny] == 0 && s[nx][ny] == '@') 22 dfs(nx, ny); 23 } 24 } 25 26 int main(){ 27 int cnt, i, j; 28 //ifstream cin("a.txt"); 29 while(cin >> n >> m){ 30 cnt = 0; 31 memset(visit, 0, sizeof(visit));//很重要 32 for(i = 0; i < n; i++) 33 cin >> s[i]; 34 35 for(i = 0; i < n; i++) 36 for(j = 0; j < m; j++){ 37 if(visit[i][j] == 0 && s[i][j] == '@'){ 38 cnt++; 39 dfs(i, j); 40 } 41 } 42 cout << cnt << endl; 43 } 44 //system("pause"); 45 }
越努力,越幸运