蓝桥杯 2014本科C++ B组 六角填数 枚举排列

标题:六角填数

 

   

  如图【1.png】所示六角形中,填入1~12的数字。

 

    使得每条直线上的数字之和都相同。

 

    图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?

 

请通过浏览器提交答案,不要填写多余的内容。

简单的枚举排列,只要提前将12个结点标号,来判断六个线段总和是否相等。

答案是 10       (num[7]这是我标定的序号)

代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define MAXN 13
 5 int num[MAXN];
 6 int used[MAXN];
 7 bool flag=false;
 8 using namespace std;
 9 void dfs(int cur)
10 {
11     int i,j;
12     bool ok;
13     if(cur==13)
14     {
15         if(num[1]+num[4]+num[7]+num[9]==num[2]+num[4]+num[5]+num[6]&&num[2]+num[4]+num[5]+num[6]==num[1]+num[5]+num[8]+num[12]&&num[1]+num[5]+num[8]+num[12]==num[6]+num[8]+num[11]+num[3]&&num[6]+num[8]+num[11]+num[3]==num[2]+num[7]+num[10]+num[3]&&num[2]+num[7]+num[10]+num[3]==num[9]+num[10]+num[11]+num[12])
16         {
17             for(i=1;i<=12;i++)
18             cout<<num[i]<<endl;
19             flag=true;
20         }    
21     }
22     for(i=1;i<=12;i++)
23     {
24         ok=true;
25         for(j=1;j<=cur-1;j++)
26         {
27             if(used[i]||num[j]==i)
28                 ok=false;
29         }
30         if(ok)
31         {
32             num[cur]=i;
33             used[i]=1;
34             dfs(cur+1);
35         }
36         if(flag)
37             return;
38         used[i]=0;
39     }
40 } 
41 int main()
42 {
43     memset(used,0,sizeof(used));
44     used[1]=1;
45     used[3]=1;
46     used[8]=1;
47     num[1]=1;
48     num[2]=8;
49     num[3]=3;
50     dfs(4);
51     return 0;
52 }

 

转载于:https://www.cnblogs.com/fancy-itlife/p/4299058.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值