码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-02-25 00:38:58      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:

标题:六角填数

 

   技术分享

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

 

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

 

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

 

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

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

代码如下:

 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 }

 

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

标签:

原文地址:http://www.cnblogs.com/fancy-itlife/p/4299058.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!