zoukankan      html  css  js  c++  java
  • NYOJ-488 素数环

    素数环

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:2
    描写叙述

    有一个整数n,把从1到n的数字无反复的排列成环,且使每相邻两个数(包含首尾)的和都为素数。称为素数环。

    为了简便起见,我们规定每一个素数环都从1開始。

    比如,下图就是6的一个素数环。

    输入
    有多组測试数据。每组输入一个n(0<n<20)。n=0表示输入结束。

    输出
    每组第一行输出相应的Case序号,从1開始。


    假设存在满足题意叙述的素数环,从小到大输出。
    否则输出No Answer。

    例子输入
    6
    8
    3
    0
    例子输出
    Case 1:
    1 4 3 2 5 6
    1 6 5 2 3 4
    Case 2:
    1 2 3 8 5 6 7 4
    1 2 5 8 3 4 7 6
    1 4 7 6 5 8 3 2
    1 6 7 4 3 8 5 2
    Case 3:
    No Answer


                    

    01.#include<stdio.h>
    02.#include<string.h>
    03.int used[25]; //标记位。0:未被使用;1:已被使用;
    04.int a[25]; //用于存储每一位上的数字;
    05.int prime[45] = {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,
    06.1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,
    07.0,0,0,1,0,0,0
    08.}; //素数的哈希表,下标代表详细数字,0:该数字不是素数;1:该数字是素数;
    09. 
    10.int n;
    11.int count = 1;
    12.//--------------------------------------------------------------
    13.// 此函数用于推断填入第t位置的数字i是否满足题目要求。
    14.//--------------------------------------------------------------
    15. 
    16.int check(int t,int i)//T里放I;t:第t个格子;i:要放入t中的数字。
    17.{
    18.if(t != n) //n:该素数环一共同拥有n个数字;此举表示当t没到n的时候。
    19.{
    20.if(prime[i + a[t - 1]] == 1) //推断假设要填进去的数字i与前一个数字的和是素数
    21.return 1; //满足上述条件。则返回1。
    22.else
    23.return 0; //不满足上述条件。则返回0;
    24.}
    25.else //假设当t已经等于n时,即表示已经填到最后一位的时候
    26.{
    27.if(prime[i + a[t - 1]] == 1 && prime[i + 1] == 1)/*假设要填进去的数字和前一位数字
    28.的和是素数。而且因为这是一个环,还要保证填进去的最后一个数字与第一个格子的数字‘1’的和是素数*/
    29.return 1; //满足条件。返回1。
    30.else
    31.return 0; //不满足条件返回0;
    32.}
    33.}
    34. 
    35.void trackback(int t)
    36.{
    37.int i;
    38.if(t > n) //当t大于n的时候,表明已经填全然部数字。
    39.{
    40.for(i = 1; i < n; i ++) //输出各个位上的数字;
    41.printf("%d ",a[i]);
    42.printf("%d ",a[i]); //最后一位输出换行;
    43.}
    44.else //否则的话,表示尚未到最后一位数字;
    45.{
    46.for(i = 2; i <= n; i ++) //因为第一位i经固定是1。因此从第二位開始推断,到n;
    47.{
    48.if(!used[i] && check(t, i)) //假设填入的数字尚未被使用过,而且填在这个位置是经过check函数推断合理的;
    49.{
    50.used[i] = 1; //将这个数字标记位设为1,表示已被使用;
    51.a[t] = i; //将这个数填入数组
    52.trackback(t + 1);//进行下一步的推断,递归推断;
    53.used[i] = 0;
    54.}
    55.}
    56.}
    57.}
    58.int main()
    59.{
    60.n = 10;
    61.while(scanf("%d",&n) != EOF)
    62.{
    63.if(n != 0)
    64.{
    65.if(n % 2 != 0 && n != 1)
    66.{
    67.printf("Case %d: ",count);
    68.count ++;
    69.printf("No Answer ");
    70.continue;
    71.}
    72.memset(used, 0, sizeof(used));
    73.a[1] = 1;
    74.printf("Case %d: ",count);
    75.count ++;
    76.trackback(2); //题目要求第一位是1,因此从第二位開始运行;
    77.}}
    78.return 0;
    79.}


  • 相关阅读:
    十二经络容易堵塞穴位
    考研英语词汇-乱序便携版-遗忘曲线
    分享一个硬核理工类科普节目:回到2049(12月17号取消置顶)
    191129
    191130
    191128
    191127
    191126
    191125
    微信公众号自定义菜单中添加图标(转)
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5150181.html
Copyright © 2011-2022 走看看