LQ0210 六角填数枚举
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0210 六角填数枚举相关的知识,希望对你有一定的参考价值。
题目来源:蓝桥杯2014初赛 C++ B组G题
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
如下图所示六角形中,填入 11 ~ 1212 的数字。使得每条直线上的数字之和都相同。
图中,已经替你填好了 33 个数字,请你计算星号位置所代表的数字是多少?
问题分析
用枚举法来解决。
一种方法是用置换算法函数来实现。
另外一种是用DFS来实现。
AC的C++语言程序(置换)如下:
/* LQ0210 六角填数 */
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 9;
int a[] = 2, 4, 5, 6, 7, 9, 10, 11, 12;
int main()
do
int t1 = 1 + a[0] + a[3] + a[5];
int t2 = 1 + a[1] + a[4] + a[8];
if (t1 != t2) continue;
t2 = 8 + a[0] + a[1] + a[2];
if (t1 != t2) continue;
t2 = 8 + a[3] + a[6] + 3;
if (t1 != t2) continue;
t2 = a[5] + a[6] + a[7] + a[8];
if (t1 != t2) continue;
t2 = a[2] + a[4] + a[7] + 3;
if (t1 != t2) continue;
printf("%d\\n", a[3]);
while (next_permutation(a, a + N));
return 0;
AC的C语言程序(DFS)如下:
/* LQ0210 六角填数 */
#include <stdio.h>
#include <string.h>
#define N 12
int a[N + 1], vis[N +1];
void dfs(int n)
if (n == 1 || n == 2 || n == 12)
dfs(n + 1);
else
if (n > 12)
int t1 = a[1] + a[3] + a[6] + a[8];
int t2 = a[1] + a[4] + a[7] + a[11];
if (t1 != t2) return;
t2 = a[2] + a[3] + a[4] + a[5];
if (t1 != t2) return;
t2 = a[2] + a[6] + a[9] + a[12];
if (t1 != t2) return;
t2 = a[8] + a[9] + a[10] + a[11];
if (t1 != t2) return;
t2 = a[5] + a[7] + a[10] + a[12];
if (t1 != t2) return;
printf("%d\\n", a[6]);
else
for (int i = 1; i <= 12; i++)
if (vis[i] == 0)
vis[i] = 1;
a[n] = i;
dfs(n + 1);
vis[i] = 0;
int main()
memset(vis, 0, sizeof vis);
a[1] = 1, vis[1] = 1;
a[2] = 8, vis[8] = 1;
a[12] = 3, vis[3] = 1;
dfs(1);
return 0;
以上是关于LQ0210 六角填数枚举的主要内容,如果未能解决你的问题,请参考以下文章