#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
while(1){
int iOdd = -1;
int i,j,iOddSquare,**piArr;
int iRow = 0,iColumn,iRowTemp,iColumnTemp;
int *iCheckSum;
for(;;){
cout<<"Enter Odd number:";
cin>>iOdd;
if((iOdd > 0)&& ((iOdd % 2) == 1))/*判断数值有效且是奇数*/
break;
else
cout<<"Enter error,Please again"<<endl;
}
iOddSquare = iOdd*iOdd;
iColumn = (iOdd -1 )/2;
/**********************分配内存***************************/
iCheckSum = new int[iOdd+2];//用于叫校验
if(NULL == iCheckSum){
cout<<"new fail"<<endl;
exit(-1);
}
for(i = 0;i<iOdd+2;++i)
iCheckSum[i] = 0;
/*********************分配内存*****************************/
piArr = new int *[iOdd];/*分配指向数组的指针内存*/
if(NULL==piArr){
cout<<"new fail"<<endl;
exit(-1);
}
for(i = 0; i < iOdd;++i){
piArr[i] = new int[iOdd];//数组分配内存
if(NULL == piArr[i]){//分配失败释放内存空间
for(j = i;j>=0;--j){
delete [] piArr[j];
piArr[j] = NULL;
if(0==j){
delete [] piArr;
piArr = NULL;
cout<<"new fail"<<endl;
exit(-1);
}
}
}
}
/*********************生成魔方矩阵******************************/
for(i = 0;i<iOdd;i++)
for(j = 0;j < iOdd;j++)
piArr[i][j] = 0;
piArr[0][iColumn] = 1;
for(i = 2; i<= iOddSquare;++i){
iRowTemp = iRow;
iColumnTemp = iColumn;
if(iRow-1>=0)
iRow--;
else
iRow = iRow-1+iOdd;
if(iColumn + 1<= iOdd - 1)
iColumn++;
else
iColumn = iColumn+1-iOdd;
if(piArr[iRow][iColumn]>0){
iRow = iRowTemp+1;
iColumn = iColumnTemp;
}
piArr[iRow][iColumn] = i;
}
/************************打印出矩阵******************************/
for(i = 0;i < iOdd ;++i){
for(j = 0; j < iOdd;++j)
cout<<" "<<piArr[i][j];
cout<<"\n";
}
/***********************计算校验********************************/
for(i = 0;i < iOdd;++i){
for(j = 0;j < iOdd;++j)
iCheckSum[i]+=piArr[i][j];
iCheckSum[iOdd]+=piArr[i][i];//计算对角值 '\'
iCheckSum[iOdd+1]+=piArr[i][iOdd-1-i];//计算对角值 '/'
}
for(i = 0; i < iOdd+2;++i)
if(iCheckSum[i] == (iOdd*(iOdd*iOdd+1)/2))
continue;
else{
cout<<"check sum error!"<<endl;
}
cout<<"check sum success!"<<endl;
/*******************************************************/
//释放内存
for(i = 0;i<iOdd;i++){
delete [] piArr[i];
piArr[i] =NULL;
}
delete [] piArr;
piArr = NULL;
delete [] iCheckSum;
}
/*************************************************************/
return 0;
}
魔法矩阵c++实现(nil)
最新推荐文章于 2022-07-04 19:02:09 发布