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 六角填数枚举的主要内容,如果未能解决你的问题,请参考以下文章

2014_B t7 六角填数

dfs填数问题

LQ0074 蛇形填数递推

LQ0005 数的分解枚举+进制

LQ0005 数的分解枚举+进制

LQ0020 加法变乘法枚举