2 条题解

  • 2
    @ 2022-12-13 14:57:13
    #include <bits/stdc++.h>
    using namespace std;
    int n, ans[20];
    bool hashx[20];
    int prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41};
    bool isPrime(int x)
    {
        for(int i = 0; i < 13; i++)
        {
            if(prime[i] == x)return true;
        }
        return false;
    }
    void checkAndPrint()
    { //检查输出由回溯法枚举得到的解
        if(! isPrime(ans[n] + ans[1]))return; //判断最后一个数与第一个数是否为素数,若不是则直接返回
        for(int i = 1; i <= n; i++)
        {
            printf("%d%s", ans[i], i == n ? "\n" : " ");
        }
    }
    void DFS(int num)
    { //num为环中的个数
        if(num > 1)
            if(!isPrime(ans[num] + ans[num - 1]))
                return; //如果不是素数,则返回
        if(num == n)
        {
            checkAndPrint(); //输出结果
            return;
        }
        for(int i = 2; i <= n; i++)
        {
            if(!hashx[i])
            { //没有被放入
                hashx[i] =true;
                ans[num + 1] = i;
                DFS(num + 1); //继续尝试放入下一个
                hashx[i] = false; //回溯后,重新标记为未使用
            }
        }
    }
    int main()
    {
        int casex = 0;
        while(cin>>n)
        {
            casex++;
            for(int i = 0; i < 22; i++)hashx[i] = false;
            ans[1] = 1;
            printf("Case %d:\n", casex);
            hashx[1] = true; //标记1已经被使用
            DFS(1);
        }
        return 0;
    }
    
    • 1
      @ 2023-9-4 23:59:29
      #include <bits/stdc++.h>
      using namespace std;
      int sum,n,ans[10001];
      bool flag[10001],isprime[41];
      void get_prime()
      {
      	memset(isprime, true, sizeof(isprime));
      	isprime[0] = isprime[1] = false;
      	for (int i = 2; i < 41; i++) {
      		if (isprime[i]) {
                  for (int j = i * 2; j < 41; j += i) {
                      isprime[j] = false;
                  }
              }
      	}
      }
      void f(int x)
      {
      	if(x==n+1 && ans[1]==1)
      	{
      		if(isprime[ans[1]+ans[n]])
      		{
      			for(int i=1;i<n;i++)
      			{
      				cout<<ans[i]<<' ';
      			}
      			cout<<ans[n]<<endl;
      		}
      		return;
      	}
      	else
      	{
      		for(int i=2;i<=n;i++)
      		{
      			if(flag[i]==false && (i==1 || isprime[i+ans[x-1]]))
      			{
      				flag[i]=true;
      				ans[x]=i;
      				f(x+1);
      				ans[x]=0;
      				flag[i]=false;
      			}
      		}
      	}
      }
      int main()
      {
          get_prime();
      	while(cin>>n)
      	{
      		if(sum>=1)cout<<endl;
      		memset(flag,0,sizeof(flag));
      		sum++;
      		cout<<"Case "<<sum<<":"<<endl;
      		flag[1]=1;
      		ans[1]=1;
      		f(2);
      		
      	}
      	return 0;
      }
      

      给个赞吧ヾ(≧▽≦*)o

      • 1

      信息

      ID
      1913
      时间
      1000ms
      内存
      256MiB
      难度
      4
      标签
      递交数
      85
      已通过
      37
      上传者