K - Oil Deposits ~~ [kuangbin帶你飛]專題一 簡單搜尋
阿新 • • 發佈:2018-12-09
GeoSurvComp地質調查公司負責探測地下石油儲藏。 GeoSurvComp現在在一塊矩形區域探測石油,並把這個大區域分成了很多小塊。他們通過專業裝置,來分析每個小塊中是否蘊藏石油。如果這些蘊藏石油的小方格相鄰,那麼他們被認為是同一油藏的一部分。在這塊矩形區域,可能有很多油藏。你的任務是確定有多少不同的油藏。
Input
輸入可能有多個矩形區域(即可能有多組測試)。每個矩形區域的起始行包含m和n,表示行和列的數量,1<=n,m<=100,如果m =0表示輸入的結束,接下來是n行,每行m個字元。每個字元對應一個小方格,並且要麼是'*',代表沒有油,要麼是'@',表示有油。
Output
對於每一個矩形區域,輸出油藏的數量。兩個小方格是相鄰的,當且僅當他們水平或者垂直或者對角線相鄰(即8個方向)。
Sample Input
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
Sample Output
0
1
2
2
思路:
這一題跟我以前寫的水池數目思路完全一樣;
直接上AC程式碼就行
#include<iostream> #include<queue> #include<string.h> using namespace std; char a[105][105]; int book[105][105]; struct Node { int x,y; Node() {} Node(int xx,int yy) : x(xx) , y(yy) {} }; int n,m; const int dx[] = {0,0,1,1,-1,-1,1,-1}; const int dy[] = {1,-1,1,-1,1,-1,0,0}; int bfs(int x,int y) { queue<Node> Q; Q.push(Node(x,y)); while(!Q.empty()) { Node u = Q.front() ; Q.pop() ; for(int i=0 ; i<8 ; i++) { int nowx=u.x + dx[i] ; int nowy=u.y + dy[i] ; if(nowx>=0 && nowx<n && nowy>=0 && nowy<m &&a[nowx][nowy]=='@' && book[nowx][nowy]==0 ) { book[nowx][nowy] = 1 ; Q.push(Node(nowx,nowy)); } } } return 1; } int main() { while(cin>>n>>m) { if(n==0 && m==0) { break; } memset(a,0,sizeof(a)); memset(book,0,sizeof(book)); for(int i=0 ; i<n ; i++) { for(int j=0 ; j<m ; j++ ) { cin>>a[i][j]; } } int ans=0; while(1) { int x1,y1; int f=0; for(int i=0 ; i<n ; i++) { for(int j=0 ; j<m ; j++) { if(a[i][j]=='@' && book[i][j]==0) { x1=i; y1=j; f=1; break; } } if(f==1) { break; } } if(f==0) { break; } else { book[x1][y1]=1; bfs(x1,y1); ans++; } } cout<<ans<<endl; } }