四阶幻方

本文介绍了一种通过深度优先搜索解决四阶幻方问题的方法,特别关注于剪枝策略以减少无效搜索路径,最终计算出所有可能的解决方案数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1~16的数字填入4x4的方格中,使得行、列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方。

 

四阶幻方可能有很多方案。如果固定左上角为1,请计算一共有多少种方案。

比如:

  1  2 15 16

 12 14  3  5

 13  7 10  4

  8 11  6  9

 

以及:

  1 12 13  8

  2 14  7 11

 15  3 10  6

 16  5  4  9

 

就可以算为两种不同的方案。

 

请提交左上角固定为1时的所有方案数字,不要填写任何多余内容或说明文字。


问题分析:很简单的深搜,但是要有剪枝,要不然跑啊跑啊跑的老久,虽然剪了但还是要泡的久……幸好只是填空题……剪枝我能想到的就是从第二排开始,要每次验证前一排之和是否等于34,然后最后一排时从第二列开始再验证前一列和是否是34,这样最后check的时候就只需要验证两对角线,并且能够及时推出,比如当第一排之和就不等于34的时候就不用等到四排全部排完再去验证,能够及时纠正(34是因为1到16的和的四分之一)


#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int maze[4][4];
int book[17];
int cnt = 0;

int check()
{
	int row[4],col[4],cor[2];

	memset(cor,0,sizeof(cor));
	for(int i=0; i<4; i++)
	{
		cor[0] += maze[i][i];
		cor[1] += maze[i][3-i];
	}
	if (cor[0] != 34 || cor[1] != 34)
		return 0;

	return 1;
}

int dfs(int x,int y)
{
	if (x == 4)
	{

		if (check())
			cnt++;
		return 0;
	}
		
	if (y == 0 && x > 0)
	{
		int row;
		row = maze[x-1][0] + maze[x-1][1] + maze[x-1][2] + maze[x-1][3];
		if (row != 34)
			return 0; 
	}
	if (x == 3 && y > 0)
	{
		int col;
		
		col = maze[0][y-1] + maze[1][y-1] + maze[2][y-1] + maze[3][y-1];
		if (col != 34)
			return 0;
	}
	
	for(int i=2; i<=16; i++)
	{
		if (book[i] == 0)
		{
			maze[x][y] = i;
			book[i] = 1;
			if (y == 3)
				dfs(x+1,0);
			else
				dfs(x,y+1);
			book[i] = 0;
		}
	}
	return 0;
}

int main()
{
	memset(maze,0,sizeof(maze));
	memset(book,0,sizeof(book));
	maze[0][0] = 1;
	book[1] = 1;
	dfs(0,1);
	printf("%d\n",cnt);
	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值