幻方填空(全排列)

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

• 欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个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.youkuaiyun.com/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;
}
六角幻方是一种特殊的数独问题,它是一个6x6的网格,其中每个数字从1到6恰好出现一次,并且每行、每列以及两条对角线上的数字之和都相等。暴力法填空通常涉及遍历所有可能的组合,直到找到满足条件的解决方案。以下是一个简单的Python暴力求解六角幻方的填充算法示例,其中有一些位置用`_`表示待填入的数字: ```python def is_valid_solution(grid): # 检查每行、每列、左对角线和右对角线的总和是否等于18 for row in grid: if sum(row) != 18: return False for i in range(6): if sum(grid[i]) != 18 or sum([grid[j][i] for j in range(6)]) != 18: return False if sum(grid[0][::2]) != 18 or sum(grid[4][::2]) != 18: return False if sum(grid[:, 0][::2]) != 18 or sum(grid[:, 4][::2]) != 18: return False return True def solve_hexagon(starting_grid): for num in range(1, 7): # 尝试从1到6填入空白处 for i in range(6): for j in range(6): if starting_grid[i][j] == '_': starting_grid[i][j] = num if is_valid_solution(starting_grid): return starting_grid # 如果当前布局无效,恢复并尝试下一个数字 starting_grid[i][j] = '_' raise Exception("No solution found.") # 示例网格 initial_grid = [ [1, ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' '], [' ', ' ', ' ', ' ', ' ', ' '] ] solution = solve_hexagon(initial_grid) print(f"Solved hexagon: {solution}")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值