Problema del anillo primario HDU-1016 (problema básico del informe de resolución de problemas del anillo de números primos-dfs)

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;
        }
 
}  

Supongo que te gusta

Origin blog.csdn.net/weixin_46703995/article/details/108877140
Recomendado
Clasificación