時限: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...