题目传送

代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
typedef long long ll;
using namespace std;
int n,cnt=0,a[20]={1}; //a数组记录环,第一个数是1 
bool vis[20]={false};  //标记是否取过 

bool is(int x)  //判断素数 
{
	if(x<2) return 0;
	for(int i=2;i*i<=x;i++)
	  if(x%i==0) return 0;
	return 1;
}

void dfs(int num)  
{	
	if(num==n) //已找到n个数 
	{
		if(is(1+a[n-1]))  //第一个数和最后一个数之和也要是素数 
		{
			printf("%d",a[0]);
			for(int i=1;i<n;i++) printf(" %d",a[i]); //输出 
			printf("\n");
		}
		return;
	}
	
	for(int i=2;i<=n;i++)
	{
		if(!vis[i] && is(a[num-1]+i)) //没访问过,与上一个数之和为素数 
		{
			a[num]=i;
			vis[i]=1;
			dfs(num+1);
			vis[i]=0; //回溯 取出数 
			a[num]=0; //这步应该无所谓(可省) 
		}
	}
}

int main() 
{    
    while(cin>>n)
    {
    	if(cnt) printf("\n");
    	printf("Case %d:\n",++cnt);
    	dfs(1); //数组0已经放了1,从数组下标1开始dfs 
	}
	return 0;
}

这无语的格式错误
在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐