1.png
首先理解題目意思:每個(gè)人只能做工作序號表里的一件工作且兩個(gè)人不能同時(shí)做一件工作。
AC思路:采用暴力枚舉每種可能的分配方案,子問題的解決逐步向上解決了母問題,最終原問題得解。
標(biāo)程作者:NotDeep(牛客網(wǎng))
鏈接:https://www.nowcoder.com/discuss/22696?type=6&order=0&pos=5&page=2
#include <bits/stdc++.h>
using namespace std;
vector<string> a; //a保存工作序號表
int n;
int b[10]; //標(biāo)志數(shù)組b[i]用來記錄編號為i的工作是否已經(jīng)被分配,為0表示已分配,為1表示未分配
int ret; //記錄分配計(jì)劃數(shù)目
void dfs(int i) { //dfs[i]指當(dāng)編號為0到i-1的人都已分配好工作時(shí)為編號為i到a.size()-1的人分配工作
if(i == a.size()) {
ret++; //一種分配方案結(jié)束
} else {
for(int j = 0; j < a[i].size(); j++) {
if(b[a[i][j] - '0']) {
b[a[i][j] - '0'] = 0;
dfs(i + 1);
b[a[i][j] - '0'] = 1;
}
}
}
}
int main() {
while(cin >> n) {
for(int i = 0; i < n; i++) {
string x; cin >> x;
a.push_back(x);
}
for(int i = 0; i < 10; i++) b[i] = 1;
ret = 0;
dfs(0);
cout << ret << endl;
}
return 0;
}