每天一道算法编程题(1)——网易笔试"工程师工作分配“问题

每天一道算法编程题(1)——网易笔试
1.png

首先理解题目意思:每个人只能做工作序号表里的一件工作且两个人不能同时做一件工作。
AC思路:采用暴力枚举每种可能的分配方案,子问题的解决逐步向上解决了母问题,最终原问题得解。

标程作者:NotDeep(牛客网)
链接:https://www.nowcoder.com/discuss/22696?type=6&order=0&pos=5&page=2

#include 

using namespace std;

vector a; //a保存工作序号表
int n;
int b[10]; //标志数组b[i]用来记录编号为i的工作是否已经被分配,为0表示已分配,为1表示未分配
int ret;   //记录分配计划数目
void dfs(int i) {  //dfs[i]指当编号为0到i-1的人都已分配好工作时为编号为i到a.size()-1的人分配工作
    if(i == a.size()) {
        ret++;  //一种分配方案结束
    } 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;
}

你可能感兴趣的:(每天一道算法编程题(1)——网易笔试"工程师工作分配“问题)