⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.h

📁 功能:四阶幻方全解 运算时间:3、40秒 结果:7040个 环境:Visual Studio.net 2003的vc++的控制台项目
💻 H
字号:
const int INITMSIZE =400;//矩阵组的初始化大小 
//////////////////////////////////////////////Matrix类定义开始*************************************************
class Matrix:public SqList
{
	int mmax;
	int mlength;
	SqList list1;
	int list1length;
public:
	int (*matrix)[DIM][DIM];
	Matrix()
	{
		int apd[DIM];
		for (int i = 0; i < DIM; i++)
		{
			apd[i] = 0;
		}
		matrix = new int [INITMSIZE][DIM][DIM];
		mmax = INITMSIZE;
		mlength = 0;
		list1.CountAll();	
		//list1.Display();
		list1.AppendLine(apd);
		list1length = list1.GetLength();
	}
	~Matrix()
	{
		delete []matrix;
		matrix = NULL;
	}
	int GetMLength()
	{
		return mlength;
	}
	bool IfSame(int a[], int b[]);//数组a[]和b[]中是否有相同元素,下标从1开始比较
	void AppendMatrix(int p[DIM][DIM]);	
	void CountAllMatrix();
	void Display();
};

//////////////////////////////////
bool Matrix::IfSame(int a[], int b[])
{
	int *pa = a, *pb;
	for (int i = 0; i < DIM; i++,pa++)
	{
		pb = b;
		for (int j = 0; j < DIM; j++,pb++)
		{
			if (*pa == *pb)
			{
				return true;
			}
		}
	}
	return false;
}

////////////////////////////////////
void Matrix::CountAllMatrix()///求所有的组,即包含全部1~DIM的行。
{
	int i = 1;
	int *m = list1.list[0];
	int matrixtemp[DIM][DIM];
	Stack <int *> s;
	s.Push(m);
	while (!s.StackEmpty() || (m[0] && m[1] && m[2]))
	{
		if ( i == DIM)
		{
			for ( int k = 0; k < DIM; k++)
			{
				s.GetOne(k, m);
				for (int u = 0; u < DIM; u++)
				{
					matrixtemp[k][u] = m[u];
				}
			}
			AppendMatrix(matrixtemp);
			s.Pop(m);
			i--;
		}
		while (i < DIM)
		{
			m += DIM;
			if (!(m[0] && m[1] && m[2]))
			{
				break;
			}

			int *m1 = NULL;
			int flag = 0;
			for (int k = 0; k < i; k++)
			{
				s.GetOne(k, m1);
				if (IfSame(m, m1))
				{
					flag = 1;
					break;
				}
			}

			if( flag == 0)
			{
				s.Push(m);
				i++;
			}
		}//while
		if (!(m[0] && m[1] && m[2]))
		{
			s.Pop(m);
			i--;
		}
	}//while
}
////////////////////////////////////
void Matrix::AppendMatrix(int p[DIM][DIM])
{
	if (mlength >= mmax)
	{
		if (!(matrix = (int (*)[DIM][DIM])realloc(matrix, (mmax + INCREASMENT)*DIM*DIM*sizeof(int))))
		{
			exit(0);
		}
		mmax += INCREASMENT;
	}
	int (*mt1)[DIM], *mt2, (*pt1)[DIM], *pt2;
	mt1 = matrix[mlength];
	pt1 = p;
	for (int i = 0; i < DIM; i++,mt1++,pt1++)
	{
		mt2 = mt1[0];
		pt2 = pt1[0];
		for (int j = 0; j < DIM; j++,mt2++,pt2++)
		{
			*mt2 = *pt2;
		}
	}
	mlength++;
}

/////////////////////////////////////////////////////
void Matrix::Display()
{
	int (*p)[DIM][DIM] = matrix;
	int (*p1)[DIM];
	int *p2;
	for (int i = 0; i < mlength; i++,p++)
	{
		p1 = p[0];
		for (int j = 0; j < DIM; j++,p1++)
		{
			p2 = p1[0];
			for (int k = 0; k < DIM; k++,p2++)
			{
				cout << *p2 << "   " ;
			}
			cout << endl;
		}
		cout << endl;
	}
	cout << endl << "Total Matrix is:" << mlength << endl;;
}
//////////////////////////////////////////////Matrix类定义结束*****************************************************

⌨️ 快捷键说明

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