RBG三颜色填格子(非DP实现)

**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;
}

发布了143 篇原创文章 · 获赞 4 · 访问量 7502

猜你喜欢

转载自blog.csdn.net/weixin_38023259/article/details/105219315