六角填数

本文介绍了一种解决特定六角形数独问题的方法,通过C语言的深度优先搜索和C++的多重循环实现,旨在找出使六角形各边上数字之和相等的唯一解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

解题思路,个人喜欢简单明了的方法,暴力解题更容易想得到,更容易理解。当然如果能想到好的方法,更短的代码也是可以的

以下两种方法

#include <stdio.h>  
#include<string.h> 
int a[15],vis[15];  
void DFS(int x)  
{  
    if(x==1 || x==2 || x==12)  
    {  
        DFS(x+1); return ;  
    }  
    if(x>12)  
    {  
        int b[6];  
        b[0]=a[1]+a[3]+a[6]+a[8];  
        b[1]=a[1]+a[4]+a[7]+a[11];  
        b[2]=a[2]+a[3]+a[4]+a[5];  
        b[3]=a[2]+a[6]+a[9]+a[12];  
        b[4]=a[8]+a[9]+a[10]+a[11];  
        b[5]=a[5]+a[7]+a[10]+a[12];  
        for(int j=1;j<6;j++)  
            if(b[j-1]!=b[j])  
                return ;  
        printf("%d\n",a[6]);  
            return ;  
    }  
    for(int i=2;i<=12;i++)  
        if(vis[i]==0)  
        {  
            vis[i]=1;  
            a[x]=i;  
            DFS(x+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;
}


选择一种自己喜欢的解题思路会提高做题效率

#include<iostream>
using namespace std;
int main()
{
		int a1=1,a2=8,a12=3;//已知条件, 
			for(int a3=1;a3<13;a3++)
			{
				if(a1!=a3&&a2!=a3)
				for(int a4=1;a4<13;a4++)
				{
					if(a1!=a4&&a2!=a4&&a3!=a4)
					for(int a5=1;a5<13;a5++)
					{
						if(a1!=a5&&a2!=a5&&a3!=a5&&a4!=a5)
						for(int a6=1;a6<13;a6++)
						{
							if(a1!=a6&&a2!=a6&&a3!=a6&&a4!=a6&&a5!=a6)
							for(int a7=1;a7<13;a7++)
							{
								if(a1!=a7&&a2!=a7&&a3!=a7&&a4!=a7&&a5!=a7&&a6!=a7)
								for(int a8=1;a8<13;a8++)
								{
									if(a1!=a8&&a2!=a8&&a3!=a8&&a4!=a8&&a5!=a8&&a6!=a8&&a7!=a8)
									for(int a9=1;a9<13;a9++)
									{
										if(a1!=a9&&a2!=a9&&a3!=a9&&a4!=a9&&a5!=a9&&a6!=a9&&a7!=a9&&a8!=a9)
										for(int a10=1;a10<13;a10++)
										{
											if(a1!=a10&&a2!=a10&&a3!=a10&&a4!=a10&&a5!=a10&&a6!=a10&&a7!=a10&&a8!=a10&&a9!=a10)
											for(int a11=1;a11<13;a11++)
											{
												if(a1!=a11&&a2!=a11&&a3!=a11&&a4!=a11&&a5!=a11&&a6!=a11&&a7!=a11&&a8!=a11&&a9!=a11&&a10!=a11)
                                                     	if(a1!=a12&&a2!=a12&&a3!=a12&&a4!=a12&&a5!=a12&&a6!=a12&&a7!=a12&&a8!=a12&&a9!=a12&&a10!=a12&&a11!=a12)
													{
														int b1=a1+a3+a6+a8;
														int b2=a1+a4+a7+a11;
														int b3=a8+a9+a10+a11;
														int b4=a2+a3+a4+a5;
														int b5=a2+a6+a9+a12;
														int b6=a5+a7+a10+a12;
														if(b1==b2&&b1==b3&&b1==b4&&b1==b5&&b1==b6&&b2==b3&&b2==b4&&b2==b5&&b2==b6&&b3==b4&&b3==b5&&b3==b6&&b4==b5&&b4==b6&&b5==b6)
														{
														cout<<a6<<endl;
												    	}
													}
												
											}
										}
									}
								}
							}
						}
					}
				}
			}
		
	
	
	return 0;
}


以上仅供参考,解题的方法不只有一种!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值