蓝桥杯之《幻方填空》C++

蓝桥杯第四届(2013)省赛《幻方填空》

题目描述:
幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。
欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,…16 这16个数字填写在4 x 4的方格中。

幻方填空
题目大意:
本题为填空题,只要求提交*号处的数字。
在问号和星号处填入数字,要求每行、每列以及两条对接线的数字之和相等。
问星号处的数字是多少。

解题思路:
利用C++ 头文件algorithm中的全排列函数next_permutation(),即例出图中1~16没有出现的数字,排列其所有可能的顺序,直到其顺序符合行、列、两条对接线的数字之和相等,输出并退出。

最终答案:
12

C++代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n[]={2,3,4,5,6,7,8,10,12,14};//数组n存放?和*数字。 
	int v[4][4]={ 0 };//二维数组v。 
	//给二维数组赋初值。 
	v[0][0]=16;v[0][3]=13;    // 16 ?  ?  13
	v[1][2]=11;               // ?  ?  11 ? 
	v[2][0]=9;                // 9  ?  ?  *
	v[3][1]=15;v[3][3]=1;     // ?  15 ?  1 
	do//全排列循环 
	{
		//将全排列后的数组n填入二维数组v 
		v[0][1]=n[0];v[0][2]=n[1];
		v[1][0]=n[2];v[1][1]=n[3];v[1][3]=n[4];
		v[2][1]=n[5];v[2][2]=n[6];v[2][3]=n[7];
		v[3][0]=n[8];v[3][2]=n[9];
		//每行相加 
		int h1=v[0][0]+v[0][1]+v[0][2]+v[0][3];
		int h2=v[1][0]+v[1][1]+v[1][2]+v[1][3];
		int h3=v[2][0]+v[2][1]+v[2][2]+v[2][3];
		int h4=v[3][0]+v[3][1]+v[3][2]+v[3][3];
		//每列相加 
		int L1=v[0][0]+v[1][0]+v[2][0]+v[3][0]; 
		int L2=v[0][1]+v[1][1]+v[2][1]+v[3][1]; 
		int L3=v[0][2]+v[1][2]+v[2][2]+v[3][2]; 
		int L4=v[0][3]+v[1][3]+v[2][3]+v[3][3]; 
		//对角线相加 
		int x1=v[0][0]+v[1][1]+v[2][2]+v[3][3];
		int x2=v[0][3]+v[1][2]+v[2][1]+v[3][0];
		//判断每行,每列,两对角线的和是否相等 
		if(h1==h2&&h2==h3&&h3==h4&&h4==L1&&
		   L1==L2&&L2==L3&&L3==L4&&L4==x1&&
		   x1==x2)
		{
			//如果相等,输出二维数组 
			for(int i=0;i<4;i++)
			{
				for(int j=0;j<4;j++)
				{
					cout<<v[i][j]<<" ";
				}
				cout<<endl;
			}
			break;//使do...while循环退出。 
		}
		
	}while(next_permutation(n,n+10));//全排列循环 
	return 0;
} 

输出结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值