幻方填空(全排列)

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

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

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

• 如图所示,即:

16 ? ? 13

? ? 11 ?

9 ? ? *

? 15 ? 1

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

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

在这里插入图片描述

解题思路:将未填入的数字 2,3,4,5,6,7,8,10,12,14 进行全排列,对每一种排列进行判断,直到找到符合条件的排列,然后结束。
全排列是调用里的库函数next_permutation。用法请看此链接:https://blog.csdn.net/qian2213762498/article/details/79683905
该思路只是我不成熟的想法,如果有更好的思路,欢迎大家指出。
代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
int judge(int arr[]) {
    
    //判断行、列、两条对角线的数字之和是否都相等。
	int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p;
	a = 16, d = 13, g = 11,i = 9,n = 15 ,p = 1;
	b = arr[0], c = arr[1], e = arr[2], f = arr[3];
	h = arr[4], j = arr[5], k = arr[6], l = arr[7];
	m = arr[8], o = arr[9];
	int t1 = a + b + c + d,t2 = e + f + g + h,t3 = i + j + k + l,t4 = m + n + o + p,t5 = a + f + k + p,t6 = d + g + j + m;
	int t7 = a + e + i + m, t8 = b + f + j + n, t9 = c + g + k + o, t10 = d + h + l + p;
	if (t1 == t2 && t2 == t3 && t3 == t4 && t4 == t5 && t5 == t6 &&t6 == t7 && t7 == t8 && t8 == t9 && t9 == t10) {
    
    
		cout << l << endl;
		return 1;
	}
	return 0;
}

void perm(int arr[]) {
    
    //实现全排列,有关next_permutation的使用方法已经给过链接了
	do {
    
    
		if(judge(arr))
			break;
	} while (next_permutation(arr, arr + 10));
}

int main() {
    
    
	int arr[10] = {
    
     2,3,4,5,6,7,8,10,12,14};
	perm(arr);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/sgsx11/article/details/114762208