全排列结构范例_实用_注释

#include
using namespace std;

int n, a[110], b[110]; // b[i] 记录 方案中i这个数字的出现次数 

bool check() { // 判断a[1]~a[n]有没有相同数字,有返回0,没有返回1 
	for (int i=1;i<=n;i++) b[i] = 0;
	for (int i=1;i<=n;i++) b[a[i]] ++; // 计算a数组中每个数字出现次数
	for (int i=1;i<=n;i++) {
		if (b[i]!=1) return 0;
	} 
	return 1;
}

void f(int x) { // 不仅作为一个参数,代表了当前的递归层数 
	if (x > n) { // x的值超过n的时候,说明已经递归了n次了,已经有n个循环了 
		// 如何判断方案合法性,以及如何输出 
		if (check()) {
			for (int i=1;i<=n;i++) printf("%d ",a[i]);
			printf("\n"); 
		} 	
		return;
	}
	for (int i=1;i<=n;i++) { 
		// 如何将不同递归层数当中的枚举出来的数存下来 (设定全局变量) 
		a[x] = i; // 记录,第x层递归枚举出来的数是i 
		f(x+1);
	}
} // n个1~n的循环在嵌套 
 
int main() {
	scanf("%d",&n);
	// n个循环嵌套,每个循环是1~n,最终删去相同元素方案 
	f(1);
	
	/*	 
	for (int i=1;i<=3;i++) {
		for (int j=1;j<=3;j++) {
			for (int k=1;k<=3;k++) {
				//如果存在相同数字,continue
				if (i==j || j==k || i==k) continue; 
				printf("%d %d %d\n",i,j,k);
			}
		}
	} // 暴力填数思想 + 筛选答案思想、
*/ 
	return 0;
}

你可能感兴趣的:(华迈初二-搜索与回溯,算法,数据结构)