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