工作安排(dfs深度優先搜尋)

許佳佳233發表於2017-05-20

題目

現在有n位工程師和6項工作(編號為0至5),現在給出每個人能夠勝任的工作序號表(用一個字串表示,比如:045,表示某位工程師能夠勝任0號,4號,5號工作)。現在需要進行工作安排,每位工程師只能被安排到自己能夠勝任的工作當中去,兩位工程師不能安排到同一項工作當中去。如果兩種工作安排中有一個人被安排在的工作序號不一樣就被視為不同的工作安排,現在需要計算出有多少種不同工作安排計劃。

輸入描述:

輸入資料有n+1行:
第一行為工程師人數n(1 ≤ n ≤ 6)
接下來的n行,每行一個字串表示第i(1 ≤ i ≤ n)個人能夠勝任的工作(字串不一定等長的)

輸出描述:

輸出一個整數,表示有多少種不同的工作安排方案

輸入例子:

6
012345
012345
012345
012345
012345
012345

輸出例子:

720

分析

1、題目要求是要計算出有多少種不同的工作安排,說白了就是遍歷。
2、介於題目中有特別說明n與工作型別的數目都很小,所以可以使用深度優先搜尋。
3、一般做演算法題,除非像這道題特別說明搜尋的範圍很小,不然不會使用深度優先搜尋。原因是遍歷每一種情況時間複雜度和空間複雜度都很高。比如01揹包問題其實也可以用DFS,但是由於複雜度過高,所以我們一般採用動態規劃。

程式碼:


import java.util.Scanner;

public class Main {

    private static int n;
    private static int count=0;
    private static boolean[] f=new boolean[6];
    private static void dfs(int[][] p,int[] length,int i) {
        if(i==n){
            count++;
            return;
        }
        for(int j=0;j<length[i];j++){
            if(f[p[i][j]]==false){
                f[p[i][j]]=true;
                dfs(p,length,i+1);
                f[p[i][j]]=false;
            }
        }   

    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        n=scan.nextInt();
        int[][] p=new int[n][6];
        int[] length=new int[6];
        String s;

        for(int i=0;i<n;i++){
            s=scan.next();
            length[i]=s.length();
            for(int j=0;j<length[i];j++)
                p[i][j]=Integer.parseInt(s.charAt(j)+"");
        }


        dfs(p,length,0);

        System.out.println(count);
    }

}

相關文章