2020

2020

Problem Description
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.<br><br>Note: the number of first circle should always be 1.<br><br><img src=../../data/images/1016-1.gif><br>
 

Input
n (0 < n < 20).<br>
 

Output
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.<br><br>You are to write a program that completes above process.<br><br>Print a blank line after each case.<br>
 

Sample Input
  
  
6<br>8<br>
 

Sample Output
  
  
Case 1:<br>1 4 3 2 5 6<br>1 6 5 2 3 4<br><br>Case 2:<br>1 2 3 8 5 6 7 4<br>1 2 5 8 3 4 7 6<br>1 4 7 6 5 8 3 2<br>1 6 7 4 3 8 5 2<br>
 

Source
Asia 1996, Shanghai (Mainland China)
 


思路:一般是要先找出所有的排列,然后使用DFS算法筛选。但是我提交了之后,显示时间超出要求。我在网上看了一下,优化的算法基本上就是一边拿排列一边搜索,这样可以减少不少的时间。另外,因为题目中给定了范围,把范围内的素数全部列出来,然后查表判断,也可以节省很多的时间。

若输入的数据为奇数,那么没有满足条件的排列,可以直接返回。

AC代码:

#include <iostream>
#include<cstdio>
using namespace std;


// 小于37的所有素数
 int prime[38]=
 {
     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,
     0, 0, 1,
 };




 void Output(int a[], int n)
 {
    for(int i=0;i<n;i++)
{
 if(i==n-1)
      cout<<a[i];
 else
      cout<<a[i]<<" ";
}
     cout<<endl ;
 }


 bool IsOk(int a[], int lastIndex, int curValue)
 {
     if(lastIndex<0)
         return true ;


     if(!((curValue+a[lastIndex]) & 1))
         return false ;


     if(!prime[a[lastIndex]+curValue])
         return false ;


     for(int i = 0; i <= lastIndex; i++)
        if(a[i] == curValue)
         return false ;


     return true ;
 }


 void dfs(int a[], int n, int t)
    {


     if(n & 1)
        return;


    if(t==n)
     {
         if(prime[a[0]+a[n-1]])
             Output(a,n);
     }
     else
     {
         for(int i=2;i<=n;i++)
         {
             a[t]=i;
             if(IsOk(a,t-1,i))
            dfs(a,n,t+1);
         }
     }
 }


 int main()
 {
     int a[20],n,k=1;
     while(scanf("%d",&n)!=EOF)
{
cout<<"Case "<<k<<":"<<endl;
k++;
a[0]=1;
dfs(a,n,1);
printf("\n");
}
     return 0 ;
 }

今天想写一下感悟,不是总结。

经常听别人说重要的在于思路。可是有时候就算有了思路,真正的实现起来还是很困难的。就像这个题,其实弄明白题意之后就知道要用深搜,中规中矩的用了之后,最开始是WA,然后是超时。优化也是费了老大劲,到最后几乎把最开始写的代码全都改了一遍。。。。。。好困难。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyCharm 2020是一款由JetBrains开发的集成开发环境(IDE),专门用于Python编程。它提供了许多功能和工具,以提高开发效率和代码质量。以下是PyCharm 2020的一些主要特点和功能: 1. 代码编辑器:PyCharm 2020具有强大的代码编辑功能,包括语法高亮、代码补全、代码导航、重构等。它还支持多种编码风格和代码规范,并提供了代码质量检查和自动修复功能。 2. 调试器:PyCharm 2020内置了强大的调试器,可以帮助开发人员快速定位和修复代码中的错误。它支持断点调试、变量监视、堆栈跟踪等功能,使调试过程更加高效和准确。 3. 项目管理:PyCharm 2020提供了灵活的项目管理功能,可以轻松创建、导入和管理Python项目。它支持虚拟环境、版本控制系统(如Git)和项目模板,使项目开发更加方便和可控。 4. 测试工具:PyCharm 2020集成了丰富的测试工具,包括单元测试、集成测试和性能测试。它支持各种测试框架(如unittest、pytest和doctest),并提供了测试覆盖率分析和测试报告生成等功能。 5. 数据库工具:PyCharm 2020内置了强大的数据库工具,可以连接和管理各种数据库(如MySQL、PostgreSQL和SQLite)。它提供了SQL编辑器、数据查看器、数据导入导出等功能,方便开发人员与数据库进行交互。 6. Web开发支持:PyCharm 2020对Web开发提供了全面的支持,包括Django、Flask和Pyramid等框架。它提供了模板编辑器、调试服务器、数据库集成等功能,使Web开发更加高效和便捷。 以上是PyCharm 2020的一些主要特点和功能。它是一款功能强大且易于使用的Python开发工具,适用于各种规模和类型的项目。如果你对PyCharm 2020有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值