题目:
今有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:
17126425374635
当然,如果把它倒过来,也是符合要求的。
请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。
注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等。
这里笔者使用了回溯法:
#include "pch.h"
#include <iostream>
using namespace std;
int result[15] = { 0,7,4,0,0,0,0,4,0,7,0,0,0,0,0 };
void dfs(int num) {
//跳过4
if (num == 4)dfs(num + 1);
if (num >= 7) {
for (int i = 1; i < 15; i++) {
cout << result[i];
}
}
//尝试给num找到两个合适的位置
for (int i = 1; i < 14; i++) {
if (i + num +1 < 15 && result[i] == 0 && result[i + num +1] == 0) {
result[i] = result[i + num + 1] = num;
//num成功填入,开始尝试填入num+1
dfs(num + 1);
//回退处理,该数字num的位置因为下一个数字num+1不能找到位置而要重新找位置
result[i] = result[i + num + 1] = 0;
}
}
//该数字找不到合适的地方填入,回退,修改上一个数字
return;
}
int main()
{
dfs(1);
}
还有另一种方法是手工技巧性地穷举:
0,7,4,0,0,0,0,4,0,7,0,0,0,0,0
先做5,6(因为跨度大),再考虑1,2,3,虽然花些功夫,但也能做出来,要是真正比赛可能比写程序还要省时间。