UVa 524 Prime Ring Problem

原创 2016年06月01日 02:29:50


来源:《算法竞赛入门经典(第二版)》例题7-4、UVa 524
题目描述:
对2 <= n <= 16,把1,…,n排成一个环,使得相邻两数之和为素数。
题目分析:
三发PE告诉我们UVa的输出格式不是玩的 = . =
小心行末不要有空格,两个case中间有一个空行。
因为n不是很大,所以手敲素数表就可以了。具体的搞法就是普通的递归-回溯法,本质是搜索的一种,非常基础的题。

//  Created by wander on 16/6/1.
//  Copyright © 2016年 W4anD0eR96. All rights reserved.
//  UVa524 Prime Ring Problem
//  类型:搜索-回溯法

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

int kase, n, ans[20] = { 1 };
bool Prime[35] = {
  0, 0, 1, 1, 0, 1, 0,
  1, 0, 0, 0, 1, 0, 1,
  0, 0, 0, 1, 0, 1, 0,
  0, 0, 1, 0, 0, 0, 0,
  0, 1, 0, 1, 0, 0, 0,
}, Used[20];

void Dfs(int d) { // d代表递归深度,这里表示已经排好了d个
  if (d >= n && Prime[ans[0] + ans[n - 1]]) { // 递归触底,注意检查首尾是否满足条件
    putchar('1');
    for (int i = 1; i < n; i += 1) printf(" %d", ans[i]);
    putchar('\n');
    return;
  }
  for (int i = 2; i <= n; i += 1)
    if (!Used[i] && Prime[i + ans[d - 1]]) {
      ans[d] = i; Used[i] = true; Dfs(d + 1); Used[i] = false;
    }
}

int main() {
#ifdef DEBUG
  freopen("in", "r", stdin);
  freopen("out", "w", stdout);
#endif
  while (~scanf("%d", &n)) {
    if (kase != 0) putchar('\n');
    printf("Case %d:\n", kase += 1);
    memset(Used, false, sizeof(Used));
    Dfs(1);
  }
  return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

UVa - 524 - Prime Ring Problem

回溯法直接搞定,注意判断素数的时候为了提高效率,直接查到小于50的素数手工打表了。。。这个方法在校赛的时候也曾经用过,当时因为超时,直接找了前2000个素数打表。。。 注意:如果最坏情况下的枚举量很大...

UVA 524 / hdu 1016 Prime Ring Problem

杭电链接:点击打开链接                                                                                    ...

UVa 524 Prime Ring Problem (数论&DFS)

524 - Prime Ring Problem Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_o...

UVA - 524 Prime Ring Problem

Prime Ring Problem  A ring is composed of n (even number) circles as shown in diagram. Put nat...
  • kun768
  • kun768
  • 2014年12月15日 17:02
  • 384

UVa 524 Prime Ring Problem(素数环)

题目链接:UVa 524 题意: 输入正整数n,把正整数1~n组成一个环,使得相邻两个整数之和均为素数。输出时从整数1开始逆时针排列。同一个环应恰好输出一次。n 分析: 简单BFS. 注意: 两测试...
  • Ramay7
  • Ramay7
  • 2015年12月30日 22:03
  • 219

UVa 524 Prime Ring Problem(DFS , 回溯)

题意  把1到n这n个数以1为首位围成一圈  输出所有满足任意相邻两数之和均为素数的所有排列 直接枚举排列看是否符合肯定会超时的  n最大为16  利用回溯法 边生成边判断  就要快很多了 #in...
  • acvay
  • acvay
  • 2014年11月20日 16:42
  • 841

UVa524 例题7-4 素数环 (Prime Ring Problem)

题目大意:  模输入正整数n,把整数1,2,3...,n,组成一个环,使得相邻的两个整数之和均为素数,输出从整数1开始逆时针排序。同一个环应恰好输出一次.n                      ...

uva 524 Prime Ring Problem

素数环问题,用回溯法解决。 #include int len; int arr[100]; int case_count; bool prime[33] = { false, fa...

UVA_524_Prime Ring Problem

#include #include #include #include #include #include #include #include #include #include #pragma wa...
  • cxy7tv
  • cxy7tv
  • 2016年04月03日 17:36
  • 118

【Jason's_ACM_解题报告】Prime Ring Problem

Prime Ring Problem 解题报告
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVa 524 Prime Ring Problem
举报原因:
原因补充:

(最多只允许输入30个字)