Descripción del problema
Un anillo se compone de n círculos como se muestra en el diagrama. Ponga el número natural
1, 2,…, n en cada círculo por separado, y la suma de los números en dos
círculos adyacentes debe ser primo.
Nota: el número del primer círculo siempre debe ser 1.
Entrada
n (0 <n <20).
Salida
El formato de salida se muestra como ejemplo a continuación.
Cada fila representa una serie de números circulares en el anillo que comienzan
desde 1 en sentido horario y antihorario. El orden de los números debe
cumplir los requisitos anteriores. Soluciones de impresión en
orden lexicográfico .
Debe escribir un programa que complete el proceso anterior.
Imprima una línea en blanco después de cada caso.
Entrada de muestra
6
8
Ejemplo de salida
Caso 1:
1 4 3 2 5 6
1 6 5 2 3 4
Caso 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
Título:
Coloca los números naturales 1, 2, ..., n en un círculo y la suma de los números en dos círculos adyacentes debe ser primo. El número del primer círculo siempre debe ser 1.
Ideas:
Primero imprima una lista de números primos, sin almacenar números primos, los números primos se marcan como 1, no 0. Luego, se realiza la búsqueda en profundidad y los dos números adyacentes en la salida se agregan al número primo. Simplemente escriba una búsqueda profunda honestamente y está bien.
Código AC
#include<stdio.h>
#include<string.h>
void dfs(int cur);
int prime(int x);
int n,a[20],b[41],c[20];
int main()
{
int i;
for(i=2;i<=40;i++)
b[i]=prime(i);//打表
int k=1;
while(scanf("%d",&n)!=EOF)
{
a[0]=1;
printf("Case %d:\n",k++);
if(n%2==0)
{
dfs(1);开始深搜
}
printf("\n");
}
return 0;
}
int prime(int x)
{
int i;
for(i=2;i*i<=x;i++)
if(x%i==0)
{
return 0;
break;
}
return 1;
}
void dfs(int cur)
{
int i;
if(cur==n&&b[a[0]+a[n-1]])
{
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
else
for(i=2;i<=n;i++)
if(!c[i]&&b[i+a[cur-1]])
{
a[cur]=i;
c[i]=1;
dfs(cur+1);
c[i]=0;
}
}