程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU--杭電--1241--Oil Deposits--廣搜

HDU--杭電--1241--Oil Deposits--廣搜

編輯:C++入門知識

Oil Deposits
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7955    Accepted Submission(s): 4678

 


Problem Description
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It then analyzes each plot separately, using sensing equipment to determine whether or not the plot contains oil. A plot containing oil is called a pocket. If two pockets are adjacent, then they are part of the same oil deposit. Oil deposits can be quite large and may contain numerous pockets. Your job is to determine how many different oil deposits are contained in a grid.

 

 

Input
The input file contains one or more grids. Each grid begins with a line containing m and n, the number of rows and columns in the grid, separated by a single space. If m = 0 it signals the end of the input; otherwise 1 <= m <= 100 and 1 <= n <= 100. Following this are m lines of n characters each (not counting the end-of-line characters). Each character corresponds to one plot, and is either `*', representing the absence of oil, or `@', representing an oil pocket.

 

 

Output
For each grid, output the number of distinct oil deposits. Two different pockets are part of the same oil deposit if they are adjacent horizontally, vertically, or diagonally. An oil deposit will not contain more than 100 pockets.

 

 

Sample Input
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0 

 

Sample Output
0
1
2
2

#include <iostream>
#include <queue>
using namespace std;
int n,m,visit[111][111],xx[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};  //xx數組是用來記錄方向的,到時候就只要直接加就好了
char map[111][111];
struct ssss
{
    int x,y;  //因為要存的是坐標,沒有可以裝兩個變量的隊列,所以先放結構體打包再加入隊列
}ss;
queue<ssss> q,qq;  //結構體類型的隊列,q是要用到,qq是用來初始化q的
void bfs()
{
    while(!q.empty())
    {
        ss=q.front();q.pop();  //用ss取出隊首元素並刪除它
        int X=ss.x,Y=ss.y;
        map[X][Y]='*';visit[X][Y]=0;  //在map裡面把當前坐標從@變成×,visit標記為已經訪問
        for(int i=0;i<8;i++)
        {
            int x=X+xx[i][0];  //8個方向一個一個來,嘿嘿
            int y=Y+xx[i][1];
            if(x>=0&&x<n&&y>=0&&y<m)  //判斷是否在范圍內
                if(visit[x][y]&&map[x][y]=='@')  //判斷是否訪問過和是否為油田@
                {
                    visit[x][y]=0;  //標記已經訪問
                    ss.x=x,ss.y=y;q.push(ss);  //先打包,再入隊
                }
        }
    }
}
int main (void)
{
    int i,j,k,l,s;
    while(cin>>n>>m&&(n||m))
    {
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
                cin>>map[i][j],visit[i][j]=1;
            q=qq;
            for(i=s=0;i<n;i++)  //全圖搜索
                for(j=0;j<m;j++)
                    if(map[i][j]=='@')  //當找到油田@
                        s++,ss.x=i,ss.y=j,q.push(ss),bfs();  //油田群數量加一,打包,入隊
                    cout<<s<<endl;
    }
    return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved