HDU_1241Oil Deposits解題報告



Oil Deposits

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4309    Accepted Submission(s): 2479


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
解法類型:DFS
解題思路:DFS直接水過。
算法實現:
#include<stdio.h>
#include<string.h>
char grid[102][102]; //儲存格子符號;
int vis[102][102]; //是否被訪問過  訪問過賦爲0,沒有賦爲1;
void DFS(int x,int y)
{
 if(grid[x][y]=='*' || vis[x][y]==0)return;//如果是*或者訪問過  直接返回不執行下面程序;
 //不是*且沒有被訪問過則執行下面程序;
 vis[x][y]=0;
 DFS(x-1,y-1);
 DFS(x-1,y);
 DFS(x-1,y+1);
 DFS(x,y-1);
 DFS(x,y+1);
 DFS(x+1,y-1);
 DFS(x+1,y);
 DFS(x+1,y+1);
 //連續的遞歸調用查找基於這個點的八個方位的所有點;
}
int main()
{
 //freopen("1.in","r",stdin);
 int m,n,i,j,count;
 while(scanf("%d %d",&n,&m)!=EOF && (n || m))
 {
  count=0;//每一次循環開始把count賦爲0,;
  memset(vis,0,sizeof(vis));//爲了方便邊界的判斷,在輸入的數據外圍加一層已訪問過的點;
    for(i=1;i<=n;i++)
    {
   scanf("%s",grid[i]);
   for(j=m;j>=1;j--)
   {
    grid[i][j]=grid[i][j-1];//把數據向後移一位;
    vis[i][j]=1;//把所有輸入的數據儲存的位置從新賦值爲0;
   }
    }
    for(i=1;i<=n;i++)//從第一個點開始搜索,一直搜索到最後一個點;
    {
     for(j=1;j<=m;j++)
     {
      if(vis[i][j]==1 && grid[i][j]=='@') //如果遇到沒有訪問過的點且這點的符號爲@的就把count的值加一;
      { 
       count++;
       DFS(i,j);//找出和這一點所有相連的@點,並且標記爲已經訪問;
      }
     }
     
    }
   printf("%d\n",count);
 }
 return 0;
 }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章