蓝桥秘密冲刺计划(10.9)六角填数

  • 定位:2014年第五届蓝桥杯省赛C/C++ B组试题G
  • 原题:六角填数
    如图所示的六角形中,填入1~12的数字。
    在这里插入图片描述
    使得每条直线上的数字之和都相同。
    图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
    请通过浏览器提交答案,不要填写多余的内容。
  • 属性:全排列函数
  • 难度:入门
  • 独白:
    这题看起来有点新奇,然后可能一时半会想不到如何模拟,然后尝试自己猜填数字,运气好还好,不好的话就走上了不归路。。。
    然后可能我们第一想到的思路还是枚举,不是说枚举不行,而是我们一旦选择了枚举这条路,那么接下来的模拟将会很困难而且复杂。我们不妨回头再分析一下这个题,12个数字放在不同的位置,12个数字,咦?我们不可以尝试全排列吗??我们先给12个空(12个空我们可以给定其编号1~12)填上数字然后全排列,在全排列函数中,我们将已填入的3个空白位置作为开始的判断条件。符合这样条件的排列,我们再继续判断其六条路径的和是否一致,如果一致,那么我们便得到了答案,然后输出*号位置的数便可。由题意,我们知道只有一个解,所以一旦有输出后,我们便可以跳出循环,避免不必要的判断和排列,减少时间复杂度。再一次回头分析一下这题,全排列函数用在这里简直就是perfect,所以问题只要能转化为数字类排列组合问题我们首选全排列函数。(10
  • 代码:
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[20],x;
int main(){
    for(int i=1;i<=12;i++){
    	a[i]=i;
    }
    do{
    	if(a[1]==1&&a[2]==8&&a[12]==3){
    		x=a[1]+a[3]+a[6]+a[8];
		    if((x==a[1]+a[4]+a[7]+a[11])
		        &&(x==a[8]+a[9]+a[10]+a[11])
		        &&(x==a[2]+a[3]+a[4]+a[5])
		        &&(x==a[2]+a[6]+a[9]+a[12])
		        &&(x==a[5]+a[7]+a[10]+a[12])){
			       cout<<a[6];
			       break;
		        }
    	}
    }while(next_permutation(a+1,a+13));
	return 0;
}
  • 总结:不要放过能转化为全排列函数来模拟的模型。
  • 感悟:宁静致远。
  • 归档:已归档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值