HDU 1016 搜索问题 dfs

深入理解数据库原理
以实战为基础,以数据库原理为基础,结合实战,深入理解数据库原理。
wangxiaoming

Prime Ring Problem

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 22439    Accepted Submission(s): 9982


Problem Description
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.

Note: the number of first circle should always be 1.


 

Input
n (0 < n < 20).
 

Output
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.

You are to write a program that completes above process.

Print a blank line after each case.
 

Sample Input
6 8
 

Sample Output
Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 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
 

Source
题目大意:
               输入一个数 n 然后 输出一个数字为 1 ~ n  的素数环 这个素数环的作用就是 相邻两个环数字的和为素数;

解题方法:
       首先,应该有判断素数的函数
         然后,有搜索判断是使整个素数成环 使用深度优先搜索即可求解
         最终输出结果
这里深度优先搜索:首先判断 是否可以 used[ i ] 是否为0  并且是否a[cur] + i //i 即给你的数目
                          如果满足上面的条件,那么used[i]  = 1 ,  将数记录在数组中储存起来 a[cur+1] = i;
                          dfs(cur+ 1) 搜索下个,搜索完毕之后释放used[i] = 0;
                          上面的结束之后程序就结束了;
数据结构: 采用数组来记录数据
源代码:  
#include<iostream>
#include<cstring>
using namespace std;

int a[30], used[30];
int n ;
int is_prime(int x)
{
    int i ;
    for(i = 2; i*i <=x; i++)
    {
         if(x%i == 0) return 0;
    }
    return 1;
}
void dfs(int cur)
{//从当前第一个位置开始进行查找深度优先
    int i;
    if(cur ==n && is_prime(a[1] +a[n]))
    {//打印出所有的 已经安排好了的环,这里数组是从1 开始的
        for(i = 1; i < n; i++)
        {
            cout<<a[i]<<" ";
        }
        cout<<a[n]<<endl;
        return ; // 同时程序结束
    }
    for(i = 2; i <=n; i++)
    {//第一个数是 因此从第二个数开始
    //cur 表示当前位置
        if(used[i] == 0 &&is_prime(a[cur]+i))
        {//这个是主要函数,主要进行
            used[i] = 1;
            a[cur+1] = i;  //存储数据的值
            dfs(cur +1);
            used[i] = 0; //释放供其他使用
        }
    }
}
int main()
{
    int t = 1;
    while(cin>>n)
    {
        memset(used, 0, sizeof(used));
        used[1] = 1; a[1] = 1;
        cout<<"Case "<<t++<<":"<<endl;
        dfs(1);
        cout<<endl;
    }
    return 0;
}

 

wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值