問題描述:今有7對數字:兩個1,兩個2,兩個3,...兩個7,把它們排成一行。
要求,兩個1間有1個其它數字,兩個2間有2個其它數字,以此類推,兩個7之間有7個其它數字。如下就是乙個符合要求的排列:
問題是寫出以74開頭的滿足條件的序列。
問題分析:根據問題的描述,我們很容易地知道,第7個位置是4,第9個位置是7,任務是將其餘的十個數字擺進去。擺放6,2,1的話,只能從第三個開始擺;擺放5,3的話,只能從第四個開始擺(因為位置7,9已被占用)。乙個合理的排列是每個數字恰好無重複地排在每個位置上,也就是說,乙個位置不能既出現3,又出現5。
那麼,我們可以將所有的數字要占用的位置號放進set中,如果set中恰好有14個元素,說明無重複,滿足條件;否則必定有部分位置沒有放置數字和放置超過1個數字。這裡利用了set容器內元素無重複的特性。
值得注意的是,每次迴圈一遍之後,要將set置空。
**實現:
#include #include using namespace std;
int main(){
int a[15]; //存放14位整數的陣列
memset(a,0,15*sizeof(int));
a[1] = 7;
a[2] = 4;
a[7] = 4;
a[9] = 7;
sets;
for(int i=3;i<=6;i++){ //表示第乙個6擺放的位置
for(int j=4;j<=8;j++){ //表示第乙個5擺放的位置
for(int k=4;k<=10;k++){ //表示第乙個3擺放的位置
for(int x=3;x<=11;x++){ //表示第乙個2擺放的位置
for(int y=3;y<=12;y++){ //表示第乙個1擺放的位置
s.insert(1);
s.insert(2);
s.insert(7);
s.insert(9);
s.insert(i);
s.insert(i+7);
s.insert(j);
s.insert(j+6);
s.insert(k);
s.insert(k+4);
s.insert(x);
s.insert(x+3);
s.insert(y);
s.insert(y+2);
if(s.size()==14){
a[i] = a[i+7] = 6;
a[j] = a[j+6] = 5;
a[k] = a[k+4] = 3;
a[x] = a[x+3] = 2;
a[y] = a[y+2] = 1;
for(int i=1;i<=14;i++){
cout《結果是:74151643752362
藍橋杯 排列數字 今有7對數字
今有7對數字 兩個1,兩個2,兩個3,兩個7,把它們排成一行。要求,兩個1間有1個其它數字,兩個2間有2個其它數字,以此類推,兩個7之間有7個其它數字。如下就是乙個符合要求的排列 17126425374635 當然,如果把它倒過來,也是符合要求的。請你找出另一種符合要求的排列法,並且這個排列法是以7...
7對數字 藍橋杯2014
今有7對數字 兩個1,兩個2,兩個3,兩個7,把它們排成一行。要求,兩個1間有1個其它數字,兩個2間有2個其它數字,以此類推,兩個7之間有7個其它數字。如下就是乙個符合要求的排列 當然,如果把它倒過來,也是符合要求的。請你找出另一種符合要求的排列法,並且這個排列法是以74開頭的。注意 只填寫這個14...
藍橋杯 數字排列
今有7對數字 兩個1,兩個2,兩個3,兩個7,把它們排成一行。要求,兩個1間有1個其它數字,兩個2間有2個其它數字,以此類推,兩個7之間有7個其它數字。如下就是乙個符合要求的排列 17126425374635 當然,如果把它倒過來,也是符合要求的。請你找出另一種符合要求的排列法,並且這個排列法是以7...