Prime ring problem
科普
顾名思义了,英文不差的都可以直译出来,素数环问题,这里把百度百科的词条贴出来科普一下
题目
题目描述: A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime. Note: the number of first circle should always be 1. 输入: n (1 < n < 17). 输出: The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order. You are to write a program that completes above process. Print a blank line after each case. 样例输入: 6 8 样例输出: Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 提示: 用printf打印输出。
思路
比较简单的dfs深度优先搜索+回溯法
AC代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int prime[35];
int visit[18];
int record[18];
void pre_process()
{
int i, j;
memset(prime, 1, sizeof(prime));
prime[0] = prime[1] = 0;
for (i = 2; i <= 34; i ++) {
if (prime[i]) {
for (j = i + i; j <= 34; j += i) {
prime[j] = 0;
}
}
}
}
void depth_first_search(int i, int n)
{
int j;
if (i == n && prime[1 + record[n - 1]]) { // 构成素数环(do not forge test the first data and the last data)
for (j = 0; j < n; j ++) {
if (j == n - 1)
printf("%d\n", record[j]);
else
printf("%d ", record[j]);
}
} else { // 深度优先遍历
for (j = 2; j <= n; j ++) {
if (visit[j] == 0 && prime[record[i - 1] + j]) { // j没有访问过,并且和前一个记录之和为素数
record[i] = j;
visit[j] = 1;
depth_first_search(i + 1, n);
visit[j] = 0;
}
}
}
}
int main()
{
int i, n;
i = 0;
pre_process();
while (scanf("%d", &n) != EOF) {
printf("Case %d:\n", ++ i);
memset(visit, 0, sizeof(visit));
record[0] = 1;
visit[1] = 1;
depth_first_search(1, n);
printf("\n");
}
return 0;
}
/**************************************************************
Problem: 1459
User: wangzhengyi
Language: C
Result: Accepted
Time:410 ms
Memory:912 kb
****************************************************************/

浙公网安备 33010602011771号