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