Problème d'anneau principal HDU-1016 (problème de base de l'anneau de nombre premier de rapport de résolution de problème)

Description du problème
Un anneau est composé de n cercles comme indiqué dans le diagramme. Mettez le nombre naturel
1, 2,…, n dans chaque cercle séparément, et la somme des nombres dans deux
cercles adjacents devrait être un premier.

Remarque: le numéro du premier cercle doit toujours être 1.

Entrée
n (0 <n <20).

Sortie
Le format de sortie est illustré ci-dessous.
Chaque ligne représente une série de numéros de cercle dans l'anneau commençant
à 1 dans le sens des aiguilles d'une montre et dans le sens inverse des aiguilles d'une montre. L'ordre des nombres doit
satisfaire aux exigences ci-dessus. Imprimez les solutions dans l'
ordre lexicographique .

Vous devez écrire un programme qui termine le processus ci-dessus.

Imprimez une ligne vierge après chaque cas.

Exemple d'entrée

6
8

Exemple de sortie
Cas 1:
1 4 3 2 5 6
1 6 5 2 3 4

Cas 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

Titre:

Mettez les nombres naturels 1, 2, ..., n dans un cercle, et la somme des nombres dans deux cercles adjacents doit être premier. Le numéro du premier cercle doit toujours être 1.

Idées:

Imprimez d'abord une liste de nombres premiers, sans stocker les nombres premiers, les nombres premiers sont marqués comme 1, pas 0. Ensuite, la recherche en profondeur d'abord est effectuée, et les deux nombres adjacents dans la sortie sont ajoutés au nombre premier. Tapez simplement une recherche approfondie honnêtement et c'est OK.

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

Je suppose que tu aimes

Origine blog.csdn.net/weixin_46703995/article/details/108877140
conseillé
Classement