题解 UVA524 Prime Ring Problem
Posted chloristendika
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 UVA524 Prime Ring Problem相关的知识,希望对你有一定的参考价值。
一道比较简单的DFS题,信息学奥赛一本通上有完整代码,我这里在注释上讲详细一点。
#include <bits/stdc++.h> using namespace std; int n; int a[20];//保存结果 bool b[20];//i这个数是否用过 int cnt = 0;//共有几组数据 bool Prime(int k){//判断是否为质数我就不讲解了 if(k < 2) return false; if(k == 2) return true; for(int i = 2;i * i <= k; i++){ if(k % i == 0) return false; }return true; } void dfs(int t){//当前搜索到了第t层 if(t == n && Prime(a[t - 1] + a[0])){//如果已经搜满了n个数且第n个数与第一个数的和为质数,也就是连成环,那就输出方案 for(int i = 0;i < n; i++) printf("%d%c",a[i],i == n - 1 ? ‘ ‘ : ‘ ‘); return; } if(t == 0) {//如果是第一个数,题目里默认开头必定是1,所以第一个数无条件进入 a[0] = 1; b[1] = 1;//标记为已经用过 dfs(t + 1);//继续搜索下一个数 return; } for(int i = 1;i <= n; i++){//枚举所有数 if(! b[i]){//如果还没有选过 if(t == n - 1 && Prime(i + a[n - 1 - 1])){ b[i] = 1; a[t] = i; dfs(t + 1); b[i] = 0; } else if(Prime(i + a[t - 1])){ b[i] = 1; a[t] = i; dfs(t + 1); b[i] = 0; } } } } int main(){ while(scanf("%d",&n) == 1){//有多组数据用WHILE输入 cnt++;//数据组数 + 1 memset(b,0,sizeof(b));//注意每次要清空有无用过数组 printf("Case %d: ",cnt);//由于我的输出是在dfs里就输出完成的,所以要先输出这个玩意儿 dfs(0);//从第0个数(也就是第一个)开始DFS } return 0; }
以上是关于题解 UVA524 Prime Ring Problem的主要内容,如果未能解决你的问题,请参考以下文章
uva 524 prime ring problem——yhx
UVA524-Prime Ring Problem(搜索剪枝)