**RGB三颜色的一种简单实现,,,,其实要把三种颜色填在5个格子里面或者10个格子里面,这首先明确就不是一种组合,而是一种排列,那么排列的话,更加确定的是,不止是顺序的排列,也可以重复出现数字,所以就是一种无约束的排列,可以不加hash数组进行筛选重复数字,,,,再有一个就是回溯法,记得重复连续的去掉,收尾一样的去掉。
这里顺便对搜索做一下总结,搜索其实用处不大,,,因为排列和组合都有一套固定的方式,搜索的话就是选择拿或者不拿,只是一种组合方式,,,,实现不了排列的思想,像这道题就是体现出来了,搜索不能用在这套题上面,那样非常繁琐。。。。。
**
#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<fstream>
#include<vector>
using namespace std;
int a[22] = {0};
int N;
int total = 6;
int countt = 0;
int counti = 0;
int P[100] = {0};
vector<int> K;
int num = 0;
int KK[100];
int R;
int generate(int index) {
// if(K.size()==R) {
// size_t i;
// for (i = 0; i < K.size()-1; i++) {
// printf("%d ",K[i]);
// }
// printf("%d\n",K[i]);
// return 0;
// }
if(index == R + 1) {
int i;
for (i = 1; i < R; i++) {
printf("%d ",KK[i]);
}
printf("%d\n",KK[i]);
counti++;
return 0;//重要的!!!!
}
for(int ii = 1; ii <= N; ii++) { //关键在于x是从下标开始,从自己开始
// K.push_back(ii);
KK[index] = ii;
if(KK[index-1]==ii&&index>1) continue;
if(index==R&&KK[index]==KK[1]) continue;
generate(index+1);//对位置的递归,不断拿数 下一个数
// K.pop_back();
}
}
int main() {
// freopen("d://in.txt","r",stdin);
num = 0;
while(scanf("%d%d",&N,&R)!=EOF) {
counti = 0;
generate(1);
printf("%d",counti);
}
return 0;
}