您的位置:首页 > 编程语言 > C语言/C++

算法 数字排列问题

2016-12-21 16:30 218 查看

题目

有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。

要求:两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列: 17126425374635 当然,如果把它倒过来,也是符合要求的。请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。

注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等。

74****4*7*****

分析

回溯法解决,注意,每次填写数字都要填两个位置。

#include <stdio.h>
#include <math.h>
#define m 14
int a[14]={0};

bool ok(int x){
for(int i=0;i<x;i++){
if(a[i]==a[x]){//填过了
return false;
}
}
return true;
}

void dfs(int t){
if(t==m){
//打印一下
for(int i=0;i<m;i++){
printf("%d",a[i]);
}
return;
}
if(a[t]==0){//t位置没有数字
for(int i=1;i<=7;i++){
a[t]=i;//第1个位置填入1~7
//每次填写数字都要填两个位置,t是第一个位置,t+i+1是第二个位置
if(a[t+i+1]==0 && ok(t)){//第二个位置不能有初始数字并且没有填过
a[t+i+1]=i;//第2个位置填入1~7
dfs(t+1);//下一层
a[t+i+1]=0;//吐出第2个位置
}
a[t]=0;//吐出第1个位置
}
}else{
dfs(t+1);//t位置有数字,往下走
}
}

int main(){
a[0]=7,a[1]=4,a[6]=4,a[8]=7;//初始存在的
dfs(2);//0,1,2开始
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息