素数环
查看原帖
素数环
767364
mimangdetongluoshao楼主2024/7/4 19:17
#include<bits/stdc++.h>
#include<time.h>

bool can[20];

int key(int,int,int*,int*);
/*key(填格子,最多数量,环,count)*/

bool soup(int); //素数

int main(){
    //int start=clock();
    int num[20];
    int count=0;
    int n;
    scanf("%d",&n);
    //printf("2:%d 5:%d 15:%d\n",soup(2),soup(5),soup(15));
    key(1,n,num,&count);
    
    if(count==0) printf("-1");
    
	return 0;
}

int key(int x,int n,int* num,int* count){
	/*if(clock()-start>=900){
        printf("-1");
        exit(1);
    }*/
    //printf("%d",x);
    if(x>n){
    	//printf("%d\n",x);
        /*
        for(int i=1;i<=n;i++){
            int flag=0;
            for(int j=1;j<=n;j++){
                if(num[i]==num[j]) flag++;
            }
            //printf("%d\n",flag);
            if(flag>1) return 0;
        }*/
        (*count)++;
        for(int i=1;i<=n;i++){
            printf("%d ",num[i]);
        }
        printf("\n");
        return 0;
    }
    //printf("%d",x);
    for(int i=1;i<=n;i++){
        if(x==1){ //首
        	//printf("a\n");
            num[x]=i;
            can[i]=1;
            key(x+1,n,num,count);
            can[i]=0;
        }
        else if(x==n&&(!can[i])){ //尾
        	//printf("b\n");
            if(soup(i+num[x-1])&&soup(i+num[1])){
            	//printf("_b\n");
                num[x]=i;
                can[i]=1;
                key(x+1,n,num,count);
                can[i]=0;
            }
        }
        else{ //身
        	//printf("c\n");
            if(soup(i+num[x-1])&&(!can[i])){
                num[x]=i;
                can[i]=1;
                key(x+1,n,num,count);
                can[i]=0;
            }
        }
        
    }
}

bool soup(int n){
    for(int i=2;i*i<=n;i++){
        if(n%i==0) return 0;
    }
    return 1;
}
2024/7/4 19:17
加载中...