1 条题解

  • 0
    @ 2025-11-30 16:26:39

    C :

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    
    int n,a[20],v[21];
    
    int prime(int m)
    {
    	int i;
    	for(i=2;i<=sqrt(m);i++)
    		if(m%i==0)
    			break;
    	if(i<=sqrt(m))
    		return 0;
    	return 1;
    }
    
    void dfs(int r)
    {
    	int i,j;
    	if(r==n)
    	{
    		if(prime(a[r-1]+1))
    		{
    			for(j=0;j<n;j++)
    				printf(j==n-1?"%d\n":"%d ",a[j]);
    		}
    		return;
    	}
    	for(i=2;i<=n;i++)
    	{
    		if(!v[i]&&prime(a[r-1]+i))
    		{
    			v[i]=1;
    			a[r]=i;
    			dfs(r+1);
    			v[i]=0;
    		}
    	}
    }
    
    int main()
    {
    	int c=0;
    	while(scanf("%d",&n)!=EOF)
    	{
    		printf("Case %d:\n",++c);
    		if(n%2==0)
    		{
    			memset(v,0,sizeof(v));
    			a[0]=v[1]=1;
    			dfs(1);
    		}
    		puts("");
    	}
    	return 0;
    }
    

    C++ :

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    
    int n,a[20],v[21];
    
    int prime(int m)
    {
    	int i;
    	for(i=2;i<=sqrt(m);i++)
    		if(m%i==0)
    			break;
    	if(i<=sqrt(m))
    		return 0;
    	return 1;
    }
    
    void dfs(int r)
    {
    	int i,j;
    	if(r==n)
    	{
    		if(prime(a[r-1]+1))
    		{
    			for(j=0;j<n;j++)
    				printf(j==n-1?"%d\n":"%d ",a[j]);
    		}
    		return;
    	}
    	for(i=2;i<=n;i++)
    	{
    		if(!v[i]&&prime(a[r-1]+i))
    		{
    			v[i]=1;
    			a[r]=i;
    			dfs(r+1);
    			v[i]=0;
    		}
    	}
    }
    
    int main()
    {
    	int c=0;
    	while(scanf("%d",&n)!=EOF)
    	{
    		printf("Case %d:\n",++c);
    		if(n%2==0)
    		{
    			memset(v,0,sizeof(v));
    			a[0]=v[1]=1;
    			dfs(1);
    		}
    		puts("");
    	}
    	return 0;
    }
    

    Java :

    import java.util.Scanner;
    
    
    public class Main {
        static int cnt;
    
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            while (in.hasNext()) {
                int n = in.nextInt();
                if (n == 1) {
                    System.out.println("Case " + ++cnt + ":\n");
                    continue;
                }
                init(n);
                calc(n);
            }
        }
    
        private static void init(int n) {
            used = new boolean[n];
            N = new int[n];
        }
    
        private static void calc(int n) {
            System.out.println("Case " + ++cnt + ":");
            solve(0, n);
            System.out.println();
        }
    
        static boolean[] used;
        static int[] N;
    
        private static void solve(int pos, int n) {
            if (pos == n) {
                if (valid(N.length - 1)) {
                    print();
                }
                return;
            }
    
            if (N[0] > 1) return;
    
            for (int i = 0; i < n; i++) {
                if (!used[i]) {
                    N[pos] = i + 1;
                    if (valid2(pos)) {
                        used[i] = true;
                        solve(pos + 1, n);
                        used[i] = false;
                    }
                }
            }
        }
    
        private static void print() {
            for (int i = 0; i < N.length; i++) {
                if (i == 0) {
                    System.out.print(N[0]);
                    continue;
                }
                System.out.print(" " + N[i]);
            }
            System.out.println();
        }
    
        private static boolean valid(int len) {
            boolean flag = true;
            for (int i = 0; i < len; i++) {
                if (!isPrime(N[i] + N[i + 1])) {
                    flag = false;
                    break;
                }
            }
    
    
            return isPrime(N[N.length - 1] + N[0]) ? flag : false;
        }
    
        private static boolean valid2(int len) {
            boolean flag = true;
            for (int i = 0; i < len; i++) {
                if (!isPrime(N[i] + N[i + 1])) {
                    flag = false;
                    break;
                }
            }
            return flag;
        }
    
        private static boolean isPrime(int n) {
            boolean flag = true;
            for (int i = 2; i * i <= n; i++) {
                if (n % i == 0) {
                    flag = false;
                    break;
                }
            }
    
            return flag;
        }
    }
    
    
    • 1

    信息

    ID
    1225
    时间
    1000ms
    内存
    32MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者