1. 程式人生 > >POJ 1562 Oil Deposits

POJ 1562 Oil Deposits

tin n) div == data- for 全部 搜索 cin

<pre name="code" class="cpp">題目大意:輸入一個二維網格。每一個網格單元中僅僅有兩種[email protected],[email protected]*‘表示土地。求出網格中共同擁有多少塊油田?
          註意:全部橫向。豎向。對角線方向連同的油田算一塊油田。
算法思想:
          廣度優先搜索。掃描每個網格。推斷該網格是否是油田且未被標記,若是則計數加1而且進行廣搜標記全部與其相連通
          的油田,若不是則僅僅標記。掃描全然部的網格後輸出計數值就可以。

代碼例如以下:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int m,n;
const int M=105;
int color[M][M];
char grid[M][M];//註意為字符數組



void Bfs(int a,int b){
      if(color[a][b]==0) return ;
      else{
          color[a][b]=0;
          if(grid[a][b]==‘*‘) return ;
          else{
           if(a-1>0) Bfs(a-1,b);//上
           if(a+1<=m) Bfs(a+1,b);//下
           if(b-1>0) Bfs(a,b-1);//左
           if(b+1<=n) Bfs(a,b+1);//右
           if(a-1>0&&b-1>0) Bfs(a-1,b-1);//左上
           if(a-1>0&&b+1<=n) Bfs(a-1,b+1);//右上
           if(a+1<=m&&b-1>0) Bfs(a+1,b-1);//左下
           if(a+1<=m&&b+1<=n) Bfs(a+1,b+1);//右下
          }
      }
}

int main(){
   while(cin>>m>>n){     
     if(m==0) break;
     memset(color,-1,sizeof(color));
     int count=0;
     for(int i=1;i<=m;i++){
         for(int j=1;j<=n;j++){
            cin>>grid[i][j];
         }
     }
     for(int i=1;i<=m;i++){
         for(int j=1;j<=n;j++){
          if(color[i][j]==0) continue;
          else{
              if(grid[i][j]==‘*‘){
                  color[i][j]=0; 
                  continue;
              }
              else{
                  count++;
                  Bfs(i,j);
              }
          }
         }
     }
     cout<<count<<endl;
   }
    return 0;
}




   

POJ 1562 Oil Deposits