hdu1241 求聯通快(java)

每日一看

GeoSurvComp地質調查公司負責探測地下石油儲量。GeoSurvComp公司在一段時間內在一大塊矩形區域內工作,創造出一個網格把土地分成很多方塊。如果每一方塊單獨分析,使用感應設備去測定方塊中是否含有石油。含有油的方塊稱爲口袋。如果兩個口袋是相鄰的,那它們屬於同一個油牀。油牀可以相當大,可以包含衆多口袋。你的任務就是測定出有多少不同的油牀。

輸入:

輸入文件包括一個或多個網格。每一個網格輸入的第一行含有m和n,分別代表網格的橫座標和縱座標,被一個空格分開。如果m=0則標誌着輸入結束;否則1<=m<=100並且1<=n<=100。接下來輸入m行n列個網格特徵(不記錄換行符)。每一個特徵值跟一個方塊相對應,並且要麼是*(代表沒油),要麼是@代表一個石油口袋。

輸出:

對於每一個方塊,輸出不同的油田數。兩個不同的口袋屬於同一個油田,如果它們垂直水平或對角相鄰。一個油田包含少於100個口袋。

 

解題思路:遍歷所有點,求出連通塊的數量,每到一塊油田,就採用DFS或者BFS消除該油田以及附近連通的油田。

 

 

簡單dfs(直接上代碼)

 

 

package 簡單搜索;

import java.util.Scanner;

/**
 * Created by user on 2017/8/23.
 */
public class hdu1241 {
    /**
     * 聯通快
     */
    static int MAX_N=100+2;
    static char map[][]=new char[MAX_N][MAX_N];
    static int n,m;
    static boolean vis[][]=new boolean[MAX_N][MAX_N];//用來標記是否是聯通快
    static int dir[][] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
    public static void main(String args[]){
        Scanner scanner=new Scanner(System.in);
        while (scanner.hasNext()){
            n=scanner.nextInt();
            m=scanner.nextInt();
            if(n+m==0){
                break;
            }
            scanner.nextLine();
            for(int i=0;i<n;i++){
                String str=scanner.nextLine();
                char a[]=str.toCharArray();
                for(int j=0;j<m;j++){
                    map[i][j]=a[j];
                }
            }
            int sum=0;
            init();
            for(int i=0;i<n;i++){
                for(int j=0;j<m;j++){
                    if(!vis[i][j]&&map[i][j]=='@'){//當從每個點出發搜索的時候 都會標記以改點擴散的油田 當從下個點搜索的時候
                        sum++;//就直接不搜索改點
                        dfs(i,j);
                    }
                }
            }
            System.out.println(sum);
        }

    }

    private static void dfs(int x, int y) {
        vis[x][y]=true;
        for(int i=0;i<8;i++){
            int dx=x+dir[i][0];
            int dy=y+dir[i][1];
            if(dx>=0&&dx<n&&dy>0&&dy<m&&!vis[dx][dy]&&map[dx][dy]=='@'){
                dfs(dx,dy);
            }
        }
    }

    private static void init() {
        for(int i=0;i<MAX_N;i++){
            for (int j=0;j<MAX_N;j++){
                vis[i][j]=false;
            }
        }
    }
}

 

 

 

 

 

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