noj算法 素數環 回溯法
阿新 • • 發佈:2018-09-30
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算法 素數環 回溯法