题目大意:输入一个整数n,输出1~n个数所能组成的所有互质数列(两两互质)
解题思路:DFS
代码如下:
/*
* 1016_2.cpp
*
* Created on: 2013年8月17日
* Author: Administrator
* 章泽天,我的女神。。。。
*/
#include <iostream>
using namespace std;
int hash[21]; //hash[] :用来标记1~30之间的数字的使用情况
int arr[21]; //arr[i] :第i个位置上的数字是。。。。
int n; //数字的数量
/**
* 判断数字是否是一个素数(质数)
* 质数:除了1和它本身不能被其他任何数整除
*/
bool check(int x) {
int i;
for (i = 2; i < x; ++i) {
if (x % i == 0) {
return false;
}
}
return true;
}
void dfs(int order, int index) {
//arr[order] = index :序列中,第order个位置上的数是index
arr[order] = index;
hash[index] = true;
int i;
//如果当前搜索的深度==指定搜索的深度
if (order == n) {
//判断最后一个数和第一个数是否互质
if (check(arr[order] + arr[1])) {
/**
* 输出满足条件的序列
*/
printf("1");
for (i = 2; i <= n; ++i) {
printf(" %d", arr[i]);
}
printf("\n");
}
}
for (i = 1; i <= n; ++i) {
//如果当前的数字i没有使用过&&它与前面一个数字互质
if (!hash[i] && check(arr[order] + i)) {
dfs(order + 1, i); //将i放进序列,进行下一层的搜索
hash[i] = 0; //注意回溯
}
}
}
int main() {
int count = 1; //用来记数
while (scanf("%d", &n) != EOF) {
printf("Case %d:\n", count++);
memset(hash, 0, sizeof(hash));
dfs(1, 1);
printf("\n");
}
}