1/17幻方填空~

如题:

幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。

欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。

他把1,2,3,...16 这16个数字填写在4 x 4的方格中。

如图p1.jpg所示,即:
16 ?  ?  13
?  ?  11 ?
9  ?  ?  *
?  15 ?  1

表中有些数字已经显露出来,还有些用?和*代替。

请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。

图:在这里插入图片描述
用了两种方法,,不想说话了。
第一种方法C语言,代码如下:

#include <stdio.h>
int main()
{
    
    
	//经过考虑,我发现了个很简单但是很困难的方法。。如下:
	int a[10];//还有十个数字
	for (a[0] = 2;a[0] <15;a[0]++)//现在剩余的最小数字是2,最大数字是14
	{
    
    
		for(a[1] = 2;a[1] <15;a[1]++)
		{
    
    
			for(a[2] = 2;a[2] < 15;a[2]++)
			{
    
    
				for(a[3] = 2;a[3] < 15;a[3]++)
				{
    
    
					for(a[4] = 2;a[4] <15;a[4]++)
					{
    
    
						for(a[5] = 2;a[5] <15;a[5]++)
						{
    
    
							for(a[6] = 2;a[6] <15;a[6]++)
							{
    
    
								for(a[7] = 2;a[7] <15;a[7]++)
								{
    
    
									for(a[8] = 2;a[8] <15;a[8]++)
									{
    
    
										for(a[9] = 2;a[9] <15;a[9]++)
										{
    
    
											if(//把 16+a[0]+a[1]+13作为对比数 
											16+a[2]+9+a[8]==   16+a[0]+a[1]+13&&
											16+a[3]+a[6]+1==   16+a[0]+a[1]+13&& 
											13+11+a[5]+a[7]==  16+a[0]+a[1]+13&& 
											a[2]+a[3]+11+a[4]==16+a[0]+a[1]+13&&
											9+a[5]+a[6]+a[7]== 16+a[0]+a[1]+13&&
											a[8]+15+a[9]+1==   16+a[0]+a[1]+13&&
											a[0]+a[3]+a[5]+15==16+a[0]+a[1]+13&&
											a[1]+11+a[6]+a[9]==16+a[0]+a[1]+13&&
											13+a[4]+a[7]+1==   16+a[0]+a[1]+13&&//每列每行的数都对比完了,该对比每个数了 
											a[0]!=a[1]&&a[0]!=a[2]&&a[0]!=a[3]&&a[0]!=a[4]&&a[0]!=a[5]&&a[0]!=a[6]&&a[0]!=a[7]&&a[0]!=a[8]&&a[0]!=a[9]&&
											a[1]!=a[2]&&a[1]!=a[3]&&a[1]!=a[4]&&a[1]!=a[5]&&a[1]!=a[6]&&a[1]!=a[7]&&a[1]!=a[8]&&a[1]!=a[9]&&
											a[2]!=a[3]&&a[2]!=a[4]&&a[2]!=a[5]&&a[2]!=a[6]&&a[2]!=a[7]&&a[2]!=a[8]&&a[2]!=a[9]&&
											a[3]!=a[4]&&a[3]!=a[5]&&a[3]!=a[6]&&a[3]!=a[7]&&a[3]!=a[8]&&a[3]!=a[9]&&
											a[4]!=a[5]&&a[4]!=a[6]&&a[4]!=a[7]&&a[4]!=a[8]&&a[4]!=a[9]&&
											a[5]!=a[6]&&a[5]!=a[7]&&a[5]!=a[8]&&a[5]!=a[9]&&
											a[6]!=a[7]&&a[6]!=a[8]&&a[6]!=a[9]&&
											a[7]!=a[8]&&a[7]!=a[9]&&
											a[8]!=a[9]
											)
											{
    
    
												printf("%d\n", a[7]);
												goto h; 
											} 
											 
										}
									}
								}
							}
						}
					}
				}
			}
		}
		h:break;
	 }
}

理解起来绝对非常容易的一种方法,下面,请让我们看运行代码

咦~运行代码呢?握一种植物。没有。。。因为太太太太长了,超时了。。花费了老长时间,哎。
在这里插入图片描述

看下面那种方法,全排列

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
    
    
	int sum[10];//共有十组总和 
	
	int i,j;//备用 
	
	int a[10]={
    
    2,3,4,5,6,7,8,10,12,14};
	
	do
	{
    
    
		memset(sum,0,sizeof(sum[0]));//给这些数分配空间
		
		sum[0]=16+a[0]+a[1]+13;
		
		sum[1]=a[2]+a[3]+11+a[4];
		
		sum[2]=9+a[5]+a[6]+a[7];
		
		sum[3]=a[8]+15+a[9]+1;
		
		sum[4]=16+a[2]+9+a[8];
		
		sum[5]=a[0]+a[3]+a[5]+15;
		
		sum[6]=a[1]+11+a[6]+a[9];
		
		sum[7]=13+a[4]+a[7]+1;
		
		sum[8]=16+a[3]+a[6]+1;
		
		sum[9]=13+11+a[5]+a[8];
		
	    for(i=0;i<10;i++)
	    {
    
    
	    	if (sum[0]!=sum[i])//既然每个数都相等,那么尝试从总和的第0个向上走 
	    	{
    
    
	    		break;
			}
	     	i++;
		}
		if (i==10)
		{
    
    
			cout<<a[7]; 
		  	break;
		}
	}while (next_permutation(a,a+10));//全排列(还是有点不懂) 
	return 0;
}

运行截图在这里插入图片描述
结果是12;

猜你喜欢

转载自blog.csdn.net/FG_future/article/details/112755820