博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1016 素数环(dfs + 回溯)
阅读量:5325 次
发布时间:2019-06-14

本文共 1401 字,大约阅读时间需要 4 分钟。

嗯...

 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016

 

一道很典型的dfs+回溯:

根据题意首先进行初始化,即第一个位置为1,然后进行dfs,枚举2~n之间的每一个数,如果这个数没被使用并且它和环中上一个数形成素数环,那么就把它加入环中,打上标记,然后继续dfs,最后回溯。当环上的个数正好等于n并且第一个数和最后一个数也能组成素数,则输出,输出时注意格式,很严格!

 

dfs这里还有一个剪枝:

只有n为偶数时才可能形成素数环!因为当n为奇数时,在1~n中奇数的个数比偶数多一,所以一定会形成两个奇数相邻,则构不成素数....

 

AC代码:

1 #include
2 #include
3 #include
4 5 using namespace std; 6 7 int n, ring[25], vis[25]; 8 9 inline bool is_prime(int x){10 for(int i = 2; i * i <= x; i++){11 if(x % i == 0) return 0;12 }13 return 1;14 }15 16 inline void dfs(int x){17 if(x == n && is_prime(ring[x] + ring[1])){18 for(int i = 1; i < n; i++)19 printf("%d ", ring[i]);//输出格式要严格 20 printf("%d\n", ring[n]);21 return;22 }23 for(int i = 2; i <= n; i++){24 if(!vis[i] && is_prime(ring[x] + i)){25 vis[i] = 1;26 ring[x + 1] = i;27 dfs(x + 1);28 vis[i] = 0;29 }30 }31 }32 33 int main(){34 int k = 1;35 while(~scanf("%d", &n)){36 memset(ring, 0, sizeof(ring));37 memset(vis, 0, sizeof(vis));38 ring[1] = 1;39 printf("Case %d:\n", k);40 k++;41 if(n % 2 == 0 && n > 0) dfs(1);42 printf("\n");43 }44 return 0;45 }
AC代码

 

转载于:https://www.cnblogs.com/New-ljx/p/11409638.html

你可能感兴趣的文章
使用Eclipse构建Maven的SpringMVC项目
查看>>
ajax json 动态传值
查看>>
[Xamarin] 製作Options Menu、Intent 呼叫網址和Market (转帖)
查看>>
bnu 52037 Escape from Ayutthaya
查看>>
C#是类型安全的
查看>>
c++网络编程错误(WSAStartup)
查看>>
在线图床工具的使用 https://sm.ms/
查看>>
MySQL5.7 error log时间显示问题
查看>>
Java学习1
查看>>
ThreadLocalDemo
查看>>
jquery发起get/post请求_或_获取html页面数据
查看>>
编程语言python
查看>>
Cordova学习笔记之入门
查看>>
C# winform 设置WebBowser 内核版本
查看>>
Uint8Array 对象
查看>>
ResGen.exe”已退出,代码为2 问题处理
查看>>
TopFreeTheme精选免费模板【20130629】
查看>>
【转】C++ 类中的static,const,及引用类型的初始化
查看>>
find命令
查看>>
2019ICPC西安邀请赛 - B. Product - 数论
查看>>