蓝桥杯第四届(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;
}
输出结果: