回溯篇 素數環問題NOJ1008

2021-10-10 07:10:27 字數 1355 閱讀 2723

時限:1000ms 記憶體限制:10000k 總時限:3000ms

把1到20這重新排列,使得排列後的序列a滿足:

a. 任意相鄰兩個數之和是素數

b. 不存在滿足條件a的序列b使得:a和b的前k(0 <= k <= 19)項相同且b的第k+1項比a的第k+1項小。(即按字典序排列的第一項)

沒有輸入。

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

對每個位置從1開始進行試探,並且保證當前所試的數字

(1)與之前填過的數字不重複

(2)與前一位置的數的和為素數

(3)最後乙個填寫的數與第乙個填寫的數之和是素數

在填寫第k個位置時,如果滿足上述約束條件,則繼續填

寫第k+1個位置;如果1~20個數都無法填寫到第k個位置,

則取消對第k個位置的填寫,回溯到第k-1個位置

1> 解向量:

2> 解空間樹:排列樹,(n-1)!個葉子結點

3> 剪枝函式:isprime( x[t-1]+x[t] ),

t=2,3,···,n 約束函式

#include

#include

using namespace std;

int n;

//表示n位數

int solution;

//解的個數

int set[

10000];

//記錄某一位置的數字

int mark[

10000];

//標記該數字

void

dfs(

int k)

;int

print_it()

;bool isprime

(int i)

;bool canset

(int place,

int i)

;int

main()

void

dfs(

int place)

return;}

else}}

}int

print_it()

printf

("\n");

return0;

}bool isprime

(int i)

//這個判斷法確實很簡單明瞭了

return true;

}bool canset

(int place,

int i)if(

isprime

(set[place-1]

+i))

//判斷相鄰位置之和是否為素數

else

}

NOJ 1008 素數環問題

把1到20這重新排列,使得排列後的序列a滿足 a.任意相鄰兩個數之和是素數 b.不存在滿足條件a的序列b使得 a和b的前k 0 k 19 項相同且b的第k 1項比a的第k 1項小。即按字典序排列的第一項 沒有輸入。輸出a,兩個數字之間用乙個空格隔開,第乙個數字前面和最後乙個數字後面沒有空格。無無 i...

noj1008 素數環問題

1008.素數環問題 時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述把1到20這重新排列,使得排列後的序列a滿足 a.任意相鄰兩個數之和是素數 b.不存在滿足條件a的序列b使得 a和b的前k 0 k 19 項相同且b的第k 1項比a的第k 1項小。即按字典序排列的第一項 輸...

NOJ 1008 素數環問題

時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述把1到20這重新排列,使得排列後的序列a滿足 a.任意相鄰兩個數之和是素數 b.不存在滿足條件a的序列b使得 a和b的前k 0 k 19 項相同且b的第k 1項比a的第k 1項小。即按字典序排列的第一項 輸入沒有輸入。輸出輸出a...