历届试题 幻方填空(全排列)

幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。 欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。

C_p04

他把1,2,3,...16 这16个数字填写在4 x 4的方格中。表中有些数字已经显露出来,还有些用?和*代替。请你计算出? 和 * 所代表的数字,并把 * 所代表的数字作为本题答案提交。


16的全排列的很大,所以只要对格子中没有出现的数字进行全排列即可

STL代码:

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
	int sum[10]={0},i,j;
	int a[10]={2,3,4,5,6,7,8,10,12,14};
	do
	{
		memset(sum,0,sizeof(sum));
		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];
		i=1;
	     while (i<10)
	     {
	     	if (sum[0]!=sum[i])
	     	 break;
	     	 i++;
		 }
		 if (i==10)
		  {
		  	cout<<a[7];
		  	break;
		  }
	}while (next_permutation(a,a+10));
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值