题目描述
假设有n个人坐在一张圆桌上,每个人有ni种礼物,但相邻两人收到的礼物不可相同,求所有礼物指派方法。
思路
这题和图着色问题很像不同的是这题多了一个头与尾部不能相同的限制,不过也无非是将ok函数体修改一下的事情。然后对其回溯即可。
代码
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
#define n 6
int color[n]={0}; // 每人收到的礼物数组
int color_num[n]={2,4,3,5,6,7}; // 每人可指派的礼物数量
bool ok(int t){
if(t==n-1){
if(color[0]==color[t]){
return 0;
}
}
for(int i=0;i<t-1;i++){
if(color[i]==color[i+1])
return 0;
}
if(t==0){
return 1;
}
return 1;
}
void backtrack(int t){
if(t==n){
for(int i=0;i<n;i++)
cout<<color[i]<<' ';
cout<<endl;
return;
}else{
for(int j=0;j<color_num[t];j++){
color[t]=j+1;
if(ok(t))
backtrack(t+1);
}
}
}
int main(){
backtrack(0);
}