有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行。 要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列: 17126425374635 当然,如果把它倒过来,也是符合要求的。 请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。
注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等。
![](https://img.haomeiwen.com/i2955260/d5ef2765c2066ce3.png)
分析:
其实很容易想到t代表第几位数字,然后就是判断a[t]位置是否已经有数字,如果有,traceback(t+1),否则开始往里面放数,如果a[t]放数字i,那么a[t+i+1]也要放i,就得对a[t+i+1]是否为0做个判断。
放进去之后,再通过OK()判断i是否和以前放进去的数字重复,如果重复的话,a[t],a[t+i+1]恢复为0,再考虑放i+1。
#include<stdio.h>
#define n 7
int a[n*2]={7,4,0,0,0,0,4,0,7,0,0,0,0,0};
bool OK(int t,int i){
for(int j=0;j<n*2;j++){
if(a[j]==a[t]&&t!=j&&j!=i)
return false;
}
return true;
}
void traceback(int t){
if(t==n*2){ //14位已经全部走完
for(int i=0;i<n*2;i++)
printf("%d",a[i]);
putchar('\n');
return;
}
if(a[t]!=0){ //证明a[t]已经有数字了
traceback(t+1);
}else{ //a[t]===0 ,可以放数字
for(int i=1;i<=n;i++){
if(a[t+i+1]!=0){
continue;
}else{ //a[t]==0&&a[t+i+1]==0
a[t]=i;
a[t+i+1]=i;
if(OK(t,t+i+1)){
traceback(t+1);
}
a[t]=0;
a[t+i+1]=0;
}
}
}
}
int main(){
traceback(0); //t代表是第几位
return 0;
}
![](https://img.haomeiwen.com/i2955260/c53957e79c5a1e8c.png)
网友评论