题目描述
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
*/