2048工作室吧 关注:24贴子:618
  • 30回复贴,共1

[编程~算法]素数环,这绝对是一个噩梦

只看楼主收藏回复

[C/C++ code]
language:C++
题目描述
将1~20这二十个数进行排列,使每两个相邻的数(第一个和最后一个也算(素数“环”嘛))之和为素数,列出所有结果。
输入
没有
输出
每行一种情况,每行二十个数。
提示
该题最后一共有20的阶乘次情况。
//==========//
谁能做的出来?
@PVZiphone
@qiaozhanrong
@云端的极光
@宇来自人人网


1楼2014-07-26 11:12回复
    别叫我,C我几乎不会!C#还行,最好是JAVA!


    IP属地:中国香港3楼2014-07-26 14:17
    收起回复
      注意绝对不要以为是20的阶乘


      IP属地:英国4楼2014-07-26 18:09
      收起回复
        首先,我们把填有“1”的那格作为A1,然后往后穷举
        如果相邻两个数的和不为素数就别接着找了
        比如前两个数为1和3,1+3=4不是质数,就不要找第3个数了,直接把3变成4,等等。这一步可以省下18!种情况。


        IP属地:英国5楼2014-07-26 18:18
        收起回复
          我说一下我的思路
          首先,穷举法实在是太费代码,要尽量简化
          于是我使用的是深度优先搜索(DFS),于是就有了下面这段代码
          [C/C++ code]
          #include<iostream>
          #include<cstdio>
          #include<cstdlib>
          #include<algorithm>
          #include<cstring>
          #include<cmath>
          using namespace std;
          int tot = 0;//素数环计数器,初值为0
          int v[50];//判断数字是否使用过的数组,1为使用过,0为未使用过
          int lj[50];//路径数组
          bool pd(int k){//判断是否为素数的子程序
          for (int i = 2; i <=sqrt(k); i++){
          if (k%i==0){
          return false;
          }
          }
          return true;
          }
          void pt();//声明输出函数
          //==========核心代码DFS==========//
          void dfs(int x){
          for (int i = 1; i <= 20; i++){
          if (pd(lj[x-1]+i)==1 && v[i]==0 || (x==1)){
          lj[x] = i;
          v[i] = 1;
          if (x==20){
          if (pd(lj[20] + lj[1])==1){
          pt();
          }
          }
          else{
          dfs(x+ 1);
          }
          v[i] = 0;
          }
          }
          }
          void pt(){
          for (int i = 1; i <= 20; i++){
          printf("%d ", lj[i]);
          }
          tot++;
          printf("\n");
          }
          int main(){
          memset(v,0,sizeof(v));
          dfs(1);
          system("pause");
          return 0;
          }
          反正这题只能省速度,不能省情况
          [FreeBASIC code]
          Dim Shared v(50) As Integer
          dim Shared lj(50) As Integer
          Dim Shared tot As Integer = 0
          Declare Sub pt()
          function pd(ByVal k As Integer) As Integer
          Dim i As Integer
          For i = 2 To Sqr(k)
          If k Mod i = 0 Then
          Return 0
          End If
          Next i
          Return 1
          End Function
          Sub dfs(ByVal x As Integer)
          Dim i As Integer
          For i = 1 To 20
          if pd(lj(x-1)+i)=1 or x=1 Then
          If v(i)=0 Then
          lj(x) = i
          v(i) = 1
          If x=20 Then
          If pd(lj(20) + lj(1))=1 Then
          pt()
          End If
          Else
          dfs(x+1)
          End If
          v(i) = 0
          EndIf
          End If
          Next i
          End Sub
          Sub pt()
          Dim i As Integer
          for i = 1 to 20
          Print lj(i)
          Next i
          tot=tot+1
          Sleep
          End Sub
          Sub main()
          Dim i As Integer
          For i = 0 To 50
          v(i)=0
          Next i
          dfs(1)
          Print tot
          Sleep
          End Sub
          main()
          End
          //==========
          @qiaozhanrong


          6楼2014-07-26 20:03
          收起回复