1. 程式人生 > >noj算法 素數環 回溯法

noj算法 素數環 回溯法

clu clas 輸入 check col 回溯法 name bsp mes

描述:

把1到20這重新排列,使得排列後的序列A滿足:
a. 任意相鄰兩個數之和是素數
b. 不存在滿足條件a的序列B使得:A和B的前k(0 <= k <= 19)項相同且B的第k+1項比A的第k+1項小。(即按字典序排列的第一項)

輸入:

沒有輸入。

輸出:

輸出A,兩個數字之間用一個空格隔開,第一個數字前面和最後一個數字後面沒有空格。

題解:

只打印字典序最小的一項即可。逐個數判斷能否與我們放好的前一個數相加為素數,若不是素數,則回溯;若是,繼續搜索。找到滿足條件的第一個解即可。

代碼:

#include <iostream>
#include 
<string.h> #include <stdio.h> #include <math.h> using namespace std; int num[22]; bool used[22]; int couse=1; bool check(int x,int y) { int k=2,i=x+y; while(k<=sqrt(i)&&i%k!=0) k++; if(k>sqrt(i)) return true; return false; } void print() { printf(
"%d",num[1]); for(int i=2;i<=20;i++) printf(" %d",num[i]); printf("\n"); } void Search(int x) { for(int i=1;i<=20;i++) { if(!used[i]&&check(num[x-1],i)&&couse==1) { num[x]=i; used[i]=true; if(x==20&&check(num[1
],num[20])&&couse==1) {print();couse++;return ;} Search(x+1); used[i]=false; } } } int main() { Search(1); return 0; }

noj算法 素數環 回溯法