六角填数(DFS)

来源:互联网 发布:手机计步器软件排行 编辑:程序博客网 时间:2024/05/01 02:49

题目是這样的:
如图【1.png】所示六角形中,填入1~12的数字。
这里写图片描述
使得每条直线上的数字之和都相同。
图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?

解法:
将12个数字放置到12个位置中,深度搜索,暴力枚举的方法每放置一个数字,检查之前所放置位置的数字是否出现重复当恰好放置12个数字并且六个边的和相同打印出所有的数字。

#include<stdio.h>#include<string.h>int t[6];int num[12];void dfs(int cur){    t[0] = num[1] + num[4] + num[7] + num[9];    t[1] = num[2] + num[5] + num[4] + num[6];    t[2] = num[1] + num[5] + num[8] + num[12];    t[3] = num[6] + num[8] + num[11] + num[3];    t[4] = num[9] + num[10] + num[11] + num[12];    t[5] = num[2] + num[7] + num[10] + num[3];    //恰好放置12个数字,+1为13     if (cur == 13) {        //六个边的和恰好相同         if (t[0] == t[1] && t[1] == t[2] && t[2] == t[3] && t[3] == t[4] && t[4] == t[5] && t[5] == t[0])            //打印结果             for (int f = 1; f <= 12; f++)                printf("%d ", num[f]);    }    //否则继续放置数字,从1开始逐个放置     else for (int i = 1; i <= 12; i++)    {        //标记变量         int ok = 1;        for (int j = 1; j < cur; j++)        {            //检查当前放置的数字是否在此之前放置过             if (num[j] == i)                ok = 0; //如果放置过标记变量为0         }        if (ok)        {            //放置该数字             num[cur] = i;            //进行下一步搜索             dfs(cur + 1);        }    }}int main() {    num[1] = 1; num[2] = 8; num[3] = 3;    dfs(4);    return 0;}
0 0
原创粉丝点击