UVA-524 素数环 题解答案代码 算法竞赛入门经典第二版

GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版

由于判断最大不超过31,因此素数的判断直接手写枚举放到代码里即可。

使用书上讲的递归枚举的时候回溯即可。

#include
#include

int PrimeArr[33] = {0, 0,1,1,0,1, 0,1,0,0,0, 1,0,1,0,0, 0,1,0,1,0, 0,0,1,0,0, 0,0,0,1,0, 1,0};
int n;
int arr[20];
int flagArr[20];

void dfs(int cus) {
	int i;
	if(cus == n) {
		if(PrimeArr[arr[n-1] + arr[0]]) {
			for(i = 0; i < n; ++i) {
				if(i != 0) putchar(' ');
				printf("%d", arr[i]);
			}
			putchar('\n');
		}
		return;
	}
	for(i = 1; i <= n; ++i) {
		if(flagArr[i] || !PrimeArr[arr[cus - 1] + i]) {
			continue;
		}
		flagArr[i] = 1;
		arr[cus] = i;
		dfs(cus + 1);
		flagArr[i] = 0;
	}
}

int main() {
	int t = 0;
	while(scanf("%d", &n) == 1) {
		if(t) putchar('\n');
		++t;
		memset(flagArr, 0, sizeof(flagArr));
		arr[0] = 1;
		flagArr[1] = 1;
		printf("Case %d:\n", t);
		dfs(1);
	}
	return 0;
}

你可能感兴趣的:(算法竞赛入门经典,算法,深度优先,图论,aoapc,c++,算法竞赛入门经典)