C++求所有的三阶魔方阵(深度优先探索)

#include <iostream>
#define DefaultSize 9
using namespace std;
class Grial
{
	public:
	Grial(int sz=DefaultSize)
	{
		visted = new bool [sz];
		data = new int [sz];
		size = sz;
		for(int i=1;i<=sz;i++)
		{
			visted[i]=0;
		}
	}
	bool check(int a[])
	{
		if( ((data[1]+data[2]+data[3])==
				(data[4]+data[5]+data[6]))&&
				((data[4]+data[5]+data[6])==
				(data[7]+data[8]+data[9]))&&
				((data[1]+data[4]+data[7])==
				(data[2]+data[5]+data[8]))&&
				((data[2]+data[5]+data[8])==
				(data[3]+data[6]+data[9]))&&
				((data[1]+data[2]+data[3])==
				(data[1]+data[5]+data[9]))&&
				((data[1]+data[2]+data[3])==
				(data[3]+data[5]+data[7])))
				return true;
		return false;
	}
	void Insert(int start)
	{
		if(start==size+1)
			{
				int k = 0;
				if(check(data))
					{
						for(int i=1;i<=size;i++)
						{
							cout<<data[i];
							k++;
							if(k%3==0)cout<<endl;
						}
					cout<<"--------------------"<<endl;
					}
			}
			else
			{
				for(int i=1;i<=size;i++)
				{
					if(visted[i]==0)
						{
							data[start]=i;
							visted[i]=1;
							Insert(start+1);
							visted[i]=0;
						}
				}
			}
	}
	private:
	int size;
	bool *visted;
	int *data;
};
int main()
{
	Grial g(9);
	g.Insert(1);
	return 0;
}

结果是:

2    7    6
9    5    1
4    3    8
--------------------
2    9    4
7    5    3
6    1    8
--------------------
4    3    8
9    5    1
2    7    6
--------------------
4    9    2
3    5    7
8    1    6
--------------------
6    1    8
7    5    3
2    9    4
--------------------
6    7    2
1    5    9
8    3    4
--------------------
8    1    6
3    5    7
4    9    2
--------------------
8    3    4
1    5    9
6    7    2
--------------------
时间: 2024-08-03 12:40:54

C++求所有的三阶魔方阵(深度优先探索)的相关文章

魔方阵算法

输出"魔方阵".所谓魔方阵是指这样的方阵,它的每一行.每一列和对角线之和均相等.例如,三阶魔方阵为      8 1 6      3 5 7      4 9 2要求输出1~n*n的自然数构成的魔方阵. 解:魔方阵中各数的排列规律如下: (1)将1放在第1行的中间一列. (2)从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列) (3)如果上一数的行数为1,则下一个数的行数为n(指最下一行).例如,1

C语言——打印魔方阵(每一行,每一列,对角线之和相等)

<一>魔方阵说明: 魔方阵是一个N*N的矩阵: 该矩阵每一行,每一列,对角线之和都相等: <二>魔方阵示例: 三阶魔方阵: 8   1   6 3   5   7 4   9   2 每一行之和:8+1+6=15: 3+5+7=15: 4+9+2=15: 每一列之和:8+3+4=15: 1+5+9=15: 6+7+2=15: 对角线之和:8+5+2=15: 6+5+4=15: <三>魔方阵计算规律(行,列以1开始): 1.将“1”放在第一行,中间一列: 2.从2开始至N

数据结构设计——魔方阵【绝对整理清楚】

魔方阵是一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m*m的数字(m为奇数),使得每一行.每一列.每条对角线的累加和都相等,如下图所示: 程序: #include<stdio.h> #include<stdlib.h> #include<string.h> #define M 100 int main() { int a[M][M]; memset(a,0,sizeof(0)); int x,y,k,m; printf("输入阶数:");

三阶魔方中心块调整配方和记忆方法

你并不需要将普通三阶魔方中心块,字魔方或者拼图魔方等须要调整中心块的角度. 所以拼图三阶或者数字三阶,都能够在普通三阶魔方的基础之上,再加上例如以下公式,便能够转好. 1.顶面中心块旋转180° URL    U2R'L'   URL    U2R'L'     -----可记为----->     (URL U2R'L')2 2.顶面中心块顺时针转90°同一时候前面中心块逆时针转90° FB' LR' UD'     F'   U'D L'R F'B   U  -----可记为----> 

三阶魔方中心块调整公式

普通三阶魔方不需要转中心块,但是数字魔方或者拼图魔方等需要调整中心块的角度. 所以拼图三阶或者数字三阶,都可以在普通三阶魔方的基础之上,再加上如下公式,便可以转好. 1.顶面中心块旋转180° U R L U2 R' L' U R L U2 R' L' 2.顶面中心块顺时针转90°同时前面中心块逆时针转90° F B' L R' U D' F' U' D L' R F' B U -----------------------------------------------------------

任意阶魔方阵(幻方)的算法及C语言实现

写于2012.10: 本来这是谭浩强那本<C程序设计(第四版)>的一道课后习题,刚开始做得时候去网上找最优的算法,结果发现奇数和双偶数(4的倍数)的情况下算法都比较简单,但是单偶数(2的倍数但不是4的倍数)情况一直找不到明确的算法,就连百度百科对这一问题的解释也是“因非四的倍数作法相当复杂,在此只介绍四的倍数的作法”,而且连谭浩强那本书给的答案中竟然也变相的限定了n只能为奇数(题目并未说明).在广泛查找资料后,发现了一篇由中南大学信息科学与工程学院某教授和研究生撰写的论文,介绍了任意阶幻方的算

n阶魔方阵(奇数阵)的输出

需求 要求输出1~n2的自然数构成的魔方阵. STEP 1 什么是魔方阵? 魔方阵,古代又称"纵横图",是指组成元素为自然数1.2-n2的平方的n×n的方阵,其中每个元素值都不相等,且每行.每列以及主.副对角线上各n个元素之和都相等. STEP 2 魔方阵的规律是什么? 此处先写简单一点的奇阶魔方阵,偶数阶的算法更复杂,暂不讨论. 奇阶魔方阵的排列方法: ⑴将1放在第一行中间一列: ⑵从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1: ⑶如果上

基本算法——for循环的使用之魔方阵实现

魔方阵,是一种每一行.每一列以及对角线的和相等. 魔方阵的一种特性是: 1.第一个元素1的位置始终在第一行正中. 2.下一个元素的位置总是在刚插入位置的右上方. 3.如果右上方的位置超出方阵上边界,则新的位置应取列的最下位置. 4.如果右上方的位置超出方阵右边界,则新的位置应取行的最座位置. 5.若刚插入的元素为n的整数倍,则选刚插入元素位置的下一行同列插入下一元素. 实现代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #def

三阶魔方快速还原法还原方法

1.问题描述 对于一个三阶魔方而言,有强迫症的我们总想把它迅速还原,但是越着急越做不出来.如何学会还原魔方呢?不要怕,我这么笨的人一天都学会了,这足以鼓舞很多的人.我也很乐意做一些鼓舞大家信心的事情,希望能够对您有所帮助. 2.解决方案 (1)总体声明 首先先声明一些转动方式及其标示.如图1所示. 图1 三阶魔方说明 (2)做一个底面 首先做一个还原好的面,然后进行第二步.此步骤不解释.如(2 第一层)所示.做好一个面,这一步不用记任何公式就可以很快达成,不再赘述. 图2 从前到后分别为 1底层