【网易笔试题】看电影

题目描述

n个同学去看电影,给出k个条件,每个条件是两个人不挨着坐。求出所有满足条件的座位分配。

思路

DFS。

代码

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;

vector<vector<int> > ans;

void dfs(int n, int cnt, vector<int>& cur, map<int, vector<int> >& mp, vector<int>& vis, int pre) {
    if (cnt == n) {
        vector<int> tmp(cur.begin(), cur.end());
        ans.push_back(tmp);
        return;
    }

    for (int i=1; i<=n; ++i) {
        if (vis[i]) continue;
        if (pre != 0 && find(mp[pre].begin(), mp[pre].end(), i) != mp[pre].end()) {
            continue;
        }
        vis[i] = 1;
        cur.push_back(i);
        dfs(n, cnt+1, cur, mp, vis, i);
        vis[i] = 0;
        cur.pop_back();
    }
}

int main() {
    int n, k;
    while(cin >> n >> k) {
        map<int, vector<int> > mp;
        for (int i=0; i<k; ++i) {
            int p1, p2;
            cin >> p1 >> p2;
            mp[p1].push_back(p2);
            mp[p2].push_back(p1);
        }

        ans.clear();
        vector<int> cur;
        vector<int> vis(n+1, 0);

        dfs(n, 0, cur, mp, vis, 0);
        for (int i=0; i<ans.size(); ++i) {
            for (int j=0; j<n; ++j) {
                if (j != 0) cout << " ";
                cout << ans[i][j];
            }
            cout << endl;
        }
    }
    return 0;
}

/*
3 2
1 2
2 1
*/


发布了323 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/iCode_girl/article/details/105375898