HDU1241 Oil Deposits(dfs+連通塊問題)

背景描述java

ztw同志負責探測地下石油儲藏.ztw如今在一塊矩形區域探測石油.他經過專業設備,來分析每一個小塊中是否蘊藏石油.若是這些蘊藏石油的小方格相鄰(橫向相鄰,縱向相鄰,還有對角相鄰),那麼它們被認爲是同一油藏的一部分.在這塊矩形區域,可能有不少油藏.你的任務是肯定有多少不一樣的油藏.數組

輸入測試

輸入可能有多個矩形區域(便可能有多組測試)。每一個矩形區域的起始行包含m和n,表示行和列的數量,1<=n,m<=100,若是m=0表示輸入的結束,接下來是n行,每行m個字符.每一個字符對應一個小方格,而且要麼是‘*’、表明沒有油,要麼是‘@’,表示有油.(注意多組數據,必要的數組要及時清空~)spa

輸出code

對於每個矩形區域,輸出油藏的數量.兩個小方格是相鄰的,當且僅當他們水平或者垂直或者對角線相鄰(即8個方向)。blog

示例輸入class

 
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5 
****@
*@@*@
*@**@
@@@*@
@@**@
0 0 
 

示例輸出import

 
0
1
2
2
 
代碼:
import java.util.Scanner;

public class Main{
        static int n,m,cnt;
        static final int N=105;
        static char map[][]=new char[N][N];
        static int dx[]={0,0,1,-1, 1,-1,1,-1};
        static int dy[]={1,-1,0,0,1,-1,-1,1};
        static void dfs(int x,int y){
                if(map[x][y]=='@'){
                        map[x][y]='*';
                }
                for(int i=0;i<8;i++){
                        int xx=x+dx[i];
                        int yy=y+dy[i];
                        if(xx<0 ||yy<0 ||xx>=n ||yy>=m) continue;
                        if(map[xx][yy]=='*') continue;
                        dfs(xx,yy);
                }
        }
        public static void main(String[] args) {
                Scanner scan=new Scanner(System.in);
                while(scan.hasNext()){
                        n=scan.nextInt();
                        m=scan.nextInt();
                        if(n==0 && m==0) break;
                        for(int i=0;i<n;i++){
                                map[i]=scan.next().toCharArray();
                        }
                        cnt=0;
                        for(int i=0;i<n;i++)
                            for(int j=0;j<m;j++)
                                if(map[i][j]=='@'){
                                        dfs(i,j);
                                        cnt++;
                                }        
                        System.out.println(cnt);
                }
        }
}
相關文章
相關標籤/搜索