关闭

UVa 524 Prime Ring Problem

标签: 搜索
157人阅读 评论(0) 收藏 举报
分类:


来源:《算法竞赛入门经典(第二版)》例题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;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9643次
    • 积分:571
    • 等级:
    • 排名:千里之外
    • 原创:51篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类