工作安排(dfs深度優先搜尋)
題目
現在有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);
}
}
相關文章
- 【演算法】深度優先搜尋(DFS)演算法
- 基本演算法——深度優先搜尋(DFS)和廣度優先搜尋(BFS)演算法
- 深度優先搜尋演算法-dfs講解演算法
- 《圖論》——深度優先搜尋演算法(DFS)圖論演算法
- 深度優先搜尋演算法(DFS)講解演算法
- 深度優先搜尋(DFS)思路及演算法分析演算法
- LeetCode演算法練習——深度優先搜尋 DFSLeetCode演算法
- 學習資料結構 - 深度優先搜尋 DFS 記錄資料結構
- dfs深度優先搜尋解決迷宮類問題(遍歷)
- python 二叉樹深度優先搜尋和廣度優先搜尋Python二叉樹
- 圖的廣度優先搜尋和深度優先搜尋Python實現Python
- 深度和廣度優先搜尋演算法演算法
- leetcode 刷題之深度優先搜尋LeetCode
- 【知識點】深度優先搜尋 Depth First Search
- DFS深度優先搜尋(3)--hdu2181(哈密頓繞行世界問題)(基礎題)
- 啟發式搜尋的方式(深度優先,廣度優先)和 搜尋方法(Dijkstra‘s演算法,代價一致搜尋,貪心搜尋 ,A星搜尋)演算法
- 0基礎學演算法 搜尋篇第一講 深度優先搜尋演算法
- 再來一篇深度優先遍歷/搜尋總結?
- c++ 廣度優先搜尋(寬搜)C++
- Swift 演算法實戰之路:深度和廣度優先搜尋Swift演算法
- 深度DFS 和 廣度BFS搜尋演算法學習演算法
- 小白的深度優先搜尋(Depth First Search)學習日記(Python)Python
- 二分搜尋樹系列之[ 深度優先-層序遍歷 (ergodic) ]Go
- 二分搜尋樹系列之「深度優先-層序遍歷 (ergodic) 」Go
- js版本的(廣、深)度優先搜尋JS
- 演算法筆記(廣度優先搜尋)演算法筆記
- 【程式碼隨想錄】廣度優先搜尋
- 寫不出來的深度優先搜尋----leetcode113 路徑總和LeetCode
- POJ 1691 Painting A Board(dfs搜尋)AI
- BFS廣度優先搜尋(5)(亦可以用DFS)--hdu1241(poj1562)(基礎題)
- 演算法競賽——BFS廣度優先搜尋演算法
- 【演算法】廣度/寬度優先搜尋(BFS)演算法
- 廣度優先搜尋,分支限界- ZOJ - 1136 Multiple
- 834. 樹中距離之和-困難-樹、圖、動態規劃、深度優先搜尋動態規劃
- 廣度優先搜尋(BFS)思路及演算法分析演算法
- 「Golang成長之路」迷宮的廣度優先搜尋Golang
- JAVA圖搜尋演算法之DFS-BFSJava演算法
- python實現圖(基於圖的不同儲存方式)的深度優先(DFS)和廣度(BFS)優先遍歷Python