main.cpp

来自「用回溯法求解4阶幻方问题,列举出所有4阶幻方数阵.」· C++ 代码 · 共 180 行

CPP
180
字号
//回溯法求解4阶幻方
#include <stdio.h>

#define N 16
int flag[N];
int a[N];

typedef int (*Func)(void);

int checked15()
{
	if(a[12] + a[13] + a[14] + a[15] != 34)
		return 0;
	if(a[0] + a[5] + a[10] + a[15] != 34)
		return 0;
	if(a[3] + a[7] + a[11] + a[15] != 34)
		return 0;
	return 1;
}

int checked14()
{
	if(a[12] + a[13] + a[14] >= 34)
		return 0;
	if(a[2] + a[6] + a[10] + a[14] != 34)
		return 0;
	return 1;
}

int checked13()
{
	if(a[1] + a[5] + a[9] + a[13] != 34)
		return 0;
	return 1;
}

int checked12()
{
	if(a[0] + a[4] + a[8] + a[12] != 34)
		return 0;
	if(a[3] + a[6] + a[9] + a[12] != 34)
		return 0;
	return 1;
}

int checked11()
{
	if(a[3] + a[7] + a[11] >= 34)
		return 0;
	if(a[8] + a[9] + a[10] + a[11] != 34)
		return 0;
	return 1;
}

int checked10()
{
	if(a[2] + a[6] + a[10] >= 34)
		return 0;
	if(a[8] + a[9] + a[10] >= 34)
		return 0;
	return 1;
}

int checked9()
{
	if(a[1] + a[5] + a[9] >= 34)
		return 0;
	return 1;
}

int checked8()
{
	if(a[0] + a[4] + a[8] >= 34)
		return 0;
	return 1;
}

int checked7()
{
	if(a[4] + a[5] + a[6] + a[7] != 34)
		return 0;
	return 1;
}

int checked6()
{
	if(a[4] + a[5] + a[6] >= 34)
		return 0;
	return 1;
}

int checked5()
{
	return 1;
}

int checked4()
{
	return 1;
}

int checked3()
{
	if(a[0] + a[1] + a[2] + a[3] != 34)
		return 0;
	return 1;
}

int checked2()
{
	if(a[0] + a[1] + a[2] >= 34)
		return 0;
	return 1;
}

int checked1()
{
	return 1;
}

int checked0()
{
	return 1;
}

Func checked[] = {checked0,checked1,checked2,checked3,checked4,checked5,checked6,checked7,\
checked8,checked9,checked10,checked11,checked12,checked13,checked14,checked15};

int counter = 0;

void Print()
{
	int i;
	printf("%d \n",++counter);
	for(i=0; i<N; i++)
	{
		printf("%4d",a[i]);
		if(i%4==3)
			printf("\n");
	}
	printf("\n");
}

void main()
{
	int k;
	int i;
	for(i=0; i<N; i++)
	{
		flag[i] = 0;
		a[i] = 0;
	}

	k=0;

	while(k>=0)
	{
		while(++a[k]<=N)
		{
			if(!flag[a[k]-1])
			{
				if(k == N-1 && checked[k]())
				{
					Print();
					break;
				}
				else if(k < N-1 && checked[k]())
				{
					flag[a[k]-1] = 1;
					k++;
				}
			}
		}
		
		a[k--] = 0;
		if(k>=0)
			flag [a[k]-1] = 0;
		
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?