素数环(DFS)

题面
素数环
有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。

输入:
一个数n,表示从1求到n
输出:
多行(不重复),为1到n组成的素数环,但是要有n个数(1…n每个数都要有),4≤n≤20,
样例.in
4
样例.out
1 2 3 4
1 4 3 2
2 1 4 3
2 3 4 1
3 2 1 4
3 4 1 2

题目分析
这是一道十分经典的DFS(深度优先搜索)题目,对理解其的概念是很好的(由于题目讲的很清楚,就不在多言了)

大体思路:
①判断素数,我们可以在外面写一个函数,来判断它可否合法

int judge(int s)
{
    for (int i = 2; i <= floor(sqrt(s)); i++)   
        if (s % i == 0) return 0;
    return 1;
}

②之后就到了DFS,大体框架如下:

int search(int k) //k是计步器
{
    if (k == n && 首尾的和为素数) 
    {
        输出;
    }
        else //反之
            {
                for (int i = 1; i <= n; i++) //继续找
                    if(符合题目条件 && 此数没有用过)
                        {
                            记录下来;
                            设下占位符,表示这个数已经用过了;
                            search(k+1);  //层数+1;
                            回溯(占位符回置)
                        }
            }
}

代码

#include <bits/stdc++.h>
using namespace std;

int vis[29],a[29],n; //a数组是用来存储答案的,vis是记录下那些事访问过的,那些事没试过的

int judge(int s) //判断是否为素数
{
    for (int i = 2; i <= floor(sqrt(s)); i++)   
        if (s % i == 0) return 0;  //是素数,返回“非”
    return 1;  //反之,返回“是”
}

void write() //输出
{
    for (int i = 1; i <= n; i++)
        cout<<a[i]<<' ';
    cout<<endl;
}

void search(int k)
{
    if (k == n+1 && judge(a[1]+a[n])==1) write(); //如果已经确定数已经填完了,并且首尾可以连的上,输出
            else  //反之
            {
                    for (int i = 1; i <= n; i++) //继续找
                    {
                        if (vis[i] == 0 && judge(i+a[k-1]) == 1)  //如果确定了此数句合法并且没有重复填入
                            {
                                a[k]=i;   //记录下来
                                vis[i]=1;  //设置占位符
                                search(k+1);  //向前一步搜索拓展
                                vis[i]=0;  //回溯
                            }
                    }
            }


}

int main()
{
    cin>>n;   //输入
    search(1);  //开始进行搜索,从第一个元素开始填充
    return 0;  //完美的结束程序
} 
                                           **蒟蒻新星c_uizrp_dzjopkl原创**

猜你喜欢

转载自blog.csdn.net/c_uizrp_dzjopkl/article/details/81672776
今日推荐