[蓝桥杯]第六届校赛A组第四题

题目:

今有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行。
要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:

17126425374635

当然,如果把它倒过来,也是符合要求的。

请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。

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

 

这里笔者使用了回溯法:

#include "pch.h"
#include 
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,虽然花些功夫,但也能做出来,要是真正比赛可能比写程序还要省时间。

你可能感兴趣的:([蓝桥杯]第六届校赛A组第四题)