蓝桥杯 四阶幻方

把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时的所有方案数字,不要填写任何多余内容或说明文字。

C++代码:

#include<iostream>
using namespace std;
const int n=3;
int a[4][4]={0};
int visit[17]={0};
int sum=0;
bool check(int x,int y);
bool dfs(int x,int y)
{
	if(x==n&&y==n)
	{
		for(int i=2;i<=16;i++)
		{
			if(!visit[i])
			{
				a[x][y]=i;
				if(a[3][0]+a[3][1]+a[3][2]+a[3][3]==a[0][3]+a[1][3]+a[2][3]+a[3][3]&&
				a[3][0]+a[3][1]+a[3][2]+a[3][3]==a[0][0]+a[0][1]+a[0][2]+a[0][3]&&
				a[3][0]+a[3][1]+a[3][2]+a[3][3]==a[0][0]+a[1][1]+a[2][2]+a[3][3])
				{
					sum++;
					return true;		
				}
				break;
			}
		}
		return false;
	}
	for(int i=2;i<=16;i++)
	{
		if(!visit[i])
		{
			visit[i]=1;
			a[x][y]=i;
			if(check(x,y))
			{
				if(y<3)
				{
					dfs(x,y+1);
				}
				else
				{
					dfs(x+1,(y+1)%4);
				}
			}
			visit[i]=0;
		}
	}
	return false;
}
bool check(int x,int y)
{
	if(x==0)return true;
	else if(x==1)
	{
		if(y==3)
		{
			if(a[0][0]+a[0][1]+a[0][2]+a[0][3]==a[1][0]+a[1][1]+a[1][2]+a[1][3])
			return true;
			return false;
		}
		return true;
	}
	else if(x==2)
	{
			if(y==3)
		{
			if(a[0][0]+a[0][1]+a[0][2]+a[0][3]==a[2][0]+a[2][1]+a[2][2]+a[2][3])
			return true;
			return false;
		}
		return true;
	}
	else
	{
		if(y==0)		
		{
			if(a[0][0]+a[0][1]+a[0][2]+a[0][3]==a[0][3]+a[1][2]+a[2][1]+a[3][0]&&
			a[0][0]+a[0][1]+a[0][2]+a[0][3]==a[0][0]+a[1][0]+a[2][0]+a[3][0])
			return true;
			return false;
		}
		else
		{
			if(a[0][0]+a[0][1]+a[0][2]+a[0][3]==a[0][y]+a[1][y]+a[2][y]+a[3][y])
			return true;
			return false;
		}
		
	}
}
int main()
{
	visit[1]=1;
	a[0][0]=1;
	dfs(0,1);
	cout<<sum<<endl;
	return 0;
}
答案:416

猜你喜欢

转载自blog.csdn.net/weixin_39787873/article/details/80232088