dfs笔记之素环问题

素环问题

一个环由n个圆组成,如图所示。将自然数1,2,…,n分别放入每个圆中,相邻两个圆中的数之和应为素数。

注:第一圈的数字应始终为1。

输入

n(0<n<20)。

输出

输出格式如下所示。每一行都表示环中从1顺时针和逆时针开始的一系列圈数。数字的顺序必须满足上述要求。按词典顺序打印解决方案。

你要写一个程序来完成上述过程。

在每个案例后打印一个空行。

样本输入

6

8

样本输出

案例1:

1 4 3 2 5 6

1 6 5 2 3 4

案例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
问题本身不难,但是细节比较多,想代码简洁且正确还是需要深厚的功底。
以下是本人ac代码:(本人也是借鉴了其他人的代码,勿喷)


#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=25;
int a,n[N];
bool f[N];
int sx(int a) {
    for(int i=2; i<=sqrt(a); i++ )      //记住sqrt是要加到等的
        if(a%i==0)
            return 0;
    return 1;							//可直接返回
}
void dfs(int l) {
    if(l==a && sx(n[0]+n[a-1])) {	//直接判断
        printf("%d",n[0]);			//格式要求
        for(int i=1; i<a; i++)
            printf(" %d",n[i]);
        puts("");					//细节回车
    }
    for(int i=2; i<=a; i++) {
        if((!f[i])&&sx(i+n[l-1])) {
            n[l]=i;
            f[i]=true;
            dfs(l+1);				//l+1可回溯成l
            f[i]=false;
        }
    }
}
int main() {

	int kase=1;
        while(scanf("%d",&a)!=EOF)
        {
        printf("Case %d:\n",kase++);
		memset(f,false,sizeof(f));
		n[0]=1;
	    dfs(1);
	    printf("\n");
        }
        return 0;
}


这是题目 欢迎指教。
题解:
一个一个来,和线段相同,直到判断符合条件输出即可。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值