#2014蓝桥杯-7.六角函数--------没算出(已更正)

博客讨论了一位程序员在解决数独问题时遇到的暴力搜索算法效率问题,其代码执行超过两小时仍未得出结果。文章对比了错误的C++代码和高效的解决方案,包括使用全排列优化。正解中,C++代码利用了`next_permutation`函数进行高效遍历,而C语言的优化则通过避免重复计算来提高速度。博客强调了算法优化在编程中的重要性。
摘要由CSDN通过智能技术生成

题目描述

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

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

图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?
在这里插入图片描述
请通过浏览器提交答案,不要填写多余的内容。
答案: 10

话说吧

我吐了,执行代码了两个多小时,按道理是能出答案!!!!但是还没出答案

下面是我那异常暴力的错误代码

先放这里,有时间更正!!!

#include<stdio.h>
int heng_1[20]; 
int heng_2[20];
int left_xie_1[20];
int left_xie_2[20];
int right_xie_1[20]; 
int right_xie_2[20];

int main()
{ //目标是求 left_xie_1[2]!!!
	for(int q=0; q<=3; q++)
		for(int w=1; w<=12; w++)
		{
			heng_1[q] = w;
			printf("q:%d w:%d\n", q, w);
			for(int e=0; e<=3; e++)
				for(int r=1; r<=12; r++)
				{
					heng_2[e] = r;
					for(int t=0; t<=3; t++)
						for(int y=1; y<=12; y++)
						{
							left_xie_1[t] = y;
							for(int u=0; u<=3; u++)
								for(int i=1; i<=12; i++)
								{
									left_xie_2[u] = i;
									for(int o=0; o<=3; o++)
										for(int p=1; p<=12; p++)
										{
											right_xie_1[o] = p;
											for(int a=0; a<=3; a++)
												for(int s=1; s<=12; s++)
												{
													right_xie_2[a] = s;
													
													heng_1[0] = left_xie_1[0] = 8;
													left_xie_2[0] = right_xie_1[0] = 1;
													left_xie_1[3] = right_xie_2[3] = 3;
													
													int x = heng_1[0]+heng_1[1]+heng_1[2]+heng_1[3];
													int c = heng_2[0]+heng_2[1]+heng_2[2]+heng_2[3];
													int v = left_xie_1[0]+left_xie_1[1]+left_xie_1[2]+left_xie_1[3];
													int b = left_xie_2[0]+left_xie_2[1]+left_xie_2[2]+left_xie_2[3];
													int n = right_xie_1[0]+right_xie_1[1]+right_xie_1[2]+right_xie_1[3];
													int m = right_xie_2[0]+right_xie_2[1]+right_xie_2[2]+right_xie_2[3];
													printf("x=%d c=%d v=%d b=%d n=%d m=%d\n", x, c, v, b, n, m); 
													if(x == c && x == v && x == b && x ==n && x == m)
														if(c == v && c == b && c ==n && c == m)
															if(v == b && v ==n && v == m)
																if(b ==n && b == m)
																	if(m == n)
																	{
																		printf("%d", left_xie_1[2]);
																		printf("!!!");
																		return 0;
																	}
												}
										}
								}
						}
				}
		}
	return 0;
}

下面是其他人的正解:

1.C++
可以用到全排列:
#include < algorithm>的next_permutation(start,end)
特别方便,但C没有这个

#include <bits/stdc++.h>
using namespace std;
void check(vector<int> num)
{
	//取六角形的六条边 
	int r1 = 8 + num[0] + num[1] + num[2];
	int r2 = 8 + num[3] + num[6] + 3;
	int r3 = 3 + num[7] + num[4] + num[2];
	int r4 = 1 + num[0] + num[3] + num[5];
	int r5 = 1 + num[1] + num[4] + num[8];
	int r6 = num[5] + num[6] + num[7] + num[8];
	//如果每条边相等 输出其余的九个点 
	if(r1 == r2 && r2 == r3 && r3 == r4 && r4 == r5 && r5 == r6)
	{
		for(int i = 0; i < num.size(); i++) cout << num[i] << ' ';
		cout << endl;
	}
}                   
int main()
{
	int a[] = {2,4,5,6,7,9,10,11,12};
	vector<int> num(a, a+9);
	do
	{
        //判断每种情况
		check(num);
	}while(next_permutation(num.begin(), num.end()));
	return 0;
}

2.C

跟我错的挺像的,但是人家比我聪明 T-T

#include <stdio.h>
int main()
{
    int a,b,c,d,e,f,g,h,i;
    int x,y,z,u,v,w;
    for(a=2;a<=12;a++)
    {
        if(a==3||a==8)continue;
        for(b=2;b<=12;b++)
        {
            if(b==3||b==8||b==a)continue;
            for(c=2;c<=12;c++)
            {
                if(c==3||c==8||c==b||c==a)continue;
                for(d=2;d<=12;d++)
                {
                    if(d==3||d==8||d==c||d==b||d==a)continue;
                    for(e=2;e<=12;e++)
                    {
                        if(e==3||e==8||e==d||e==d||e==c||e==b||e==a)continue;
                        for(f=2;f<=12;f++)
                        {
                            if(f==3||f==8||f==a||f==b||f==c||f==d||f==e)continue;
                            for(g=2;g<=12;g++)
                            {
                                if(g==3||g==8||g==a||g==b||g==c||g==d||g==e||g==f)continue;
                                for(h=2;h<=12;h++)
                                {
                                    if(h==3||h==8||h==a||h==b||h==c||h==d||h==e||h==f||h==g)continue;
                                    for(i=2;i<=12;i++)
                                    {
                                        if(i==3||i==8||i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h)continue;
                                        x=1+a+d+f;
                                        y=8+a+b+c;
                                        z=1+b+e+i;
                                        u=c+e+h+3;
                                        v=f+g+h+i;
                                        w=8+d+g+3;
                                        if(x==y&&x==z&&x==u&&x==v&&x==w)
                                        {
                                            printf("    1\n"); 
                                            printf("8  %d  %d  %d\n",a,b,c);
                                            printf(" %d\t%d\n",d,e);
                                            printf("%d  %d  %d  %d\n",f,g,h,i);
                                            printf("    3\n\n");
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值