排列数字问题
? ?數(shù)字排列問題
? ?今有7對數(shù)字:兩個1,兩個2,兩個3,...兩個7,把它們排成一行。
? ?要求,兩個1間有1個其它數(shù)字,兩個2間有2個其它數(shù)字,以此類推,兩個7之間有7個其它數(shù)字。如下就是一個符合要求的排列:
17126425374635
當然,如果把它倒過來,也是符合要求的。
請你找出另一種符合要求的排列法,并且這個排列法是以74開頭的。
注意:只填寫這個14位的整數(shù),不能填寫任何多余的內(nèi)容,比如說明注釋等。
74****4*7*******
解:
數(shù)字排列問題:
根據(jù)已知的數(shù)列進行重新構(gòu)造,
首先已經(jīng)放置好 7 和 4 ;
所以其余位置放置為0;
從a[14]中的第一個開始進行構(gòu)造,每一位即a[t]都有1~7六種情況
在填寫的時候進行判讀當前位置是否為0,
因為要求兩個數(shù)字之間相差數(shù)字數(shù)量等于本身?
填寫一個數(shù)直接把對應(yīng)的下一個數(shù)字進行數(shù)列中賦值。
a[t]=i,a[t+i+1]=i;?
當判斷完所有位置的時候就是到達一個解空間,
當t==n-1時判斷a[n-1]最后一位。t==n時到達解空間。?
#include <stdio.h> #define n 7 int a[14]={7,4,0,0,0,0,4,0,7,0,0,0,0,0};bool ok(int t,int i) {if(t+i+1>=2*n)//控制不超出邊界 return false;if(a[t+i+1]!=0)//控制填空位置沒有數(shù)字 return false;for(int j=0;j<t;j++){//要填寫的第一個數(shù)字之前沒有出現(xiàn)過if(a[j]==i)return false;}return true; }void dfs(int t) {if(t==2*n){for(int i=0;i<2*n;i++){printf("%d ",a[i]);}printf("\n");return;}if(a[t]!=0)//當前位置有數(shù)字,進行下一位的判斷 dfs(t+1);else{for(int i=1;i<=n;i++){//每個位置都有n種可能 if(ok(t,i)){//滿足所有情況,進行賦值 并進行下一位置的構(gòu)造 a[t]=i;a[t+i+1]=i;dfs(t+1);a[t]=0;a[t+i+1]=0;}}} }int main() {dfs(0);return 0;}
總結(jié)
- 上一篇: spoj7258:Lexicograph
- 下一篇: 区块链在众包中的应用,防止搭便车和避免不