HDU 1016 素数环(dfs + 回溯)
2024-10-20 00:34:08
嗯...
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016
一道很典型的dfs+回溯:
根据题意首先进行初始化,即第一个位置为1,然后进行dfs,枚举2~n之间的每一个数,如果这个数没被使用并且它和环中上一个数形成素数环,那么就把它加入环中,打上标记,然后继续dfs,最后回溯。当环上的个数正好等于n并且第一个数和最后一个数也能组成素数,则输出,输出时注意格式,很严格!
dfs这里还有一个剪枝:
只有n为偶数时才可能形成素数环!因为当n为奇数时,在1~n中奇数的个数比偶数多一,所以一定会形成两个奇数相邻,则构不成素数....
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream> using namespace std; int n, ring[], vis[]; inline bool is_prime(int x){
for(int i = ; i * i <= x; i++){
if(x % i == ) return ;
}
return ;
} inline void dfs(int x){
if(x == n && is_prime(ring[x] + ring[])){
for(int i = ; i < n; i++)
printf("%d ", ring[i]);//输出格式要严格
printf("%d\n", ring[n]);
return;
}
for(int i = ; i <= n; i++){
if(!vis[i] && is_prime(ring[x] + i)){
vis[i] = ;
ring[x + ] = i;
dfs(x + );
vis[i] = ;
}
}
} int main(){
int k = ;
while(~scanf("%d", &n)){
memset(ring, , sizeof(ring));
memset(vis, , sizeof(vis));
ring[] = ;
printf("Case %d:\n", k);
k++;
if(n % == && n > ) dfs();
printf("\n");
}
return ;
}
AC代码
最新文章
- codevs 1164 统计数字
- Mac系统下Android生成keystore
- How to overcome “datetime.datetime not JSON serializable” in python?
- Windows XP SP3 Professional 微软(MSDN)官方原版系统
- 在Salesforce中处理Xml的生成与解析
- SAP B1 ADDON 开发
- KeepAlive详解
- Sharepoint 问题集锦 - 外部列表(external list) - 读取当前用户上下文或用户名作为筛选参数
- String Stringbuilder Stringbuffer的区别
- Random类 一般跟生成随机数有关
- tar.gz和tar.bz2
- NPOI导出excel(2.0.6版本)
- bash编程-正则表达式
- Shell - 简明Shell入门15 - 调试(Debug)
- java④
- 【阅读笔记】《C程序员 从校园到职场》第五章 内存操作
- 学以致用十三-----Centos7.2+python3+YouCompleteMe成功历程
- Android 蓝牙通信——AndroidBluetoothManager
- iOS UISlider滑动块触摸范围调整变大
- 数据库索引&;数据页