游寒蝉寺:C语言编程问题 高手进......加分的啊~~

来源:百度文库 编辑:中科新闻网 时间:2024/05/06 07:01:18
6.打印魔方阵。

所谓魔方阵是指这样的的方阵:

它的每一行、每一列和对角线之和均相等。

输入n,要求打印由自然数1到n2的自然数构成的魔方阵(n为奇数)。

例如,当n=3时,魔方阵为:

8 1 6

3 5 7

4 9 2

魔方阵中各数排列规律为:

① 将“1”放在第一行的中间一列;

② 从“2”开始直到n×n为止的各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数同样加1;

③ 如果上一数的行数为1,则下一个数的行数为n(最下一行),如在3×3 方阵中,1在第1行,则2应放在第3行第3列。

④ 当上一个数的列数为n时,下一个数的列数应为1,行数减1。如2在第3行第3列,3应在第2行第1列。

⑤如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。如按上面的规定,4应放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6下面。

#include<iostream.h>
#include<iomanip.h>

class CMixer
{
int m;
int **data;
public:
CMixer(){m=0;data=NULL;}
void Disety();
void Set(int m1);
void Lianzhi(int m1,int n1,int k);
~CMixer()
{
if(data)
{
int i;
for(i=0;i<m;i++)
delete data[i];
delete data;
}
}
int Jishuanrows(int i);
int Jishuancols(int i);
void print();
};
void CMixer::Disety()
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
cout<<setw(3)<<data[i][j];
cout<<endl;
}
}
void CMixer::Set(int m1)
{
if(m1<=0||m1>=100)return;
int i,j;
m=m1;
data=new int*[m];
for(i=0;i<m;i++)
data[i]=new int[m];
for(i=0;i<m;i++)
for(j=0;j<m;j++)
data[i][j]=0;
Lianzhi(0,0,1);
}
void CMixer::Lianzhi(int m1,int n1,int k)
{
if(m*m<k)return;
if(1==k)
{data[0][m/2]=k;Lianzhi(0,m/2,++k);return;}
if(0==m1)
{
if(0==data[m-1][n1+1])
{data[m-1][n1+1]=k;Lianzhi(m-1,n1+1,++k);return;}
data[m1+1][n1]=k;Lianzhi(m1+1,n1,++k);return;
}
if(m-1==n1)
{
if(0==data[m1-1][0])
{data[m1-1][0]=k;Lianzhi(m1-1,0,++k);return;}
data[m1+1][n1]=k;Lianzhi(m1+1,n1,++k);return;
}
else
{
if(0==data[m1-1][n1+1])
{data[m1-1][n1+1]=k;Lianzhi(m1-1,n1+1,++k);return;}
data[m1+1][n1]=k;Lianzhi(m1+1,n1,++k);return;
}
}
int CMixer::Jishuanrows(int i)
{
int j,k=0;
for(j=0;j<m;j++)
k+=data[i][j];
return k;
}
int CMixer::Jishuancols(int i)
{
int j,k=0;
for(j=0;j<m;j++)
k+=data[j][i];
return k;
}
void CMixer::print()
{
if(NULL!=data)
{
int k=0;
while(k<m)
{
cout<<"第"<<k+1<<"行的总和:"<<Jishuanrows(k)<<endl;
k++;
}
cout<<endl;
k=0;
while(k<m)
{
cout<<"第"<<k+1<<"列的总和:"<<Jishuancols(k)<<endl;
k++;
}
}
}

void main()
{
int x;
CMixer a;
cout<<"输入魔方阵的规模(就是n)"<<endl;
cin>>x;
while(0==x%2)
{
cout<<"规模不能为偶数!请重新输入"<<endl;
cin>>x;
}
a.Set(x);
a.Disety();
a.print();
}

这是c++编的

用C语言写的,已经运行通过
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#define MAX_INDEX 100

void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}

/*快速排序算法*/
void QuickSort(int a[], int l, int r)

{
int i=l; /*从左至右的游标*/
int j=r + 1; /*从右到左的游标*/
int pivot=a[l];
if (l >= r) return;
/*把左侧>= pivot的元素与右侧<= pivot 的元素进行交换*/
while (1)
{
do
{/*在左侧寻找>= pivot 的元素*/
i = i + 1;
} while (a[i] < pivot);
do
{/*在右侧寻找<= pivot 的元素*/
j = j - 1;
} while (a[j] > pivot);
if (i >= j) break; /*未发现交换对象*/
swap(&a[i],&a[j]);
}

/*设置p i v o t*/
a[l] = a[j];
a[j] = pivot;
QuickSort(a, l, j-1); /*对左段排序*/
QuickSort(a, j+1, r); /*对右段排序*/
}

void Huanf(int Array[][MAX_INDEX],int n)
{
int i,j;
int a,b,m;
int tempArray1[MAX_INDEX];
int tempArray2[MAX_INDEX];
a=n/2;
b=a+1;
m=n%4;
switch(m)
{
case 0:
case 2:
/*穿心对调*/
for(i=0;i<n;i++)
for(j=0;j<n/2;j++)
{
if(i<n/2)
{
if(i%2==1&&Array[i][j]%2==0)/*偶行换偶*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
else if(i%2==0&&Array[i][j]%2==1)/*奇行换奇*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
}
else
{
if(i%2==1&&Array[i][j]%2==1)/*偶行换奇*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
else if(i%2==0&&Array[i][j]%2==0)/*奇行换偶*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
}

}
/*End穿心对调*/
if(m==2)
{
for(i=0;i<n/2;i++)
{
if((i!=0)&&(i!=a-1)&&(i!=b-1)&&(i!=n-1))
{
swap(&Array[i][a-1],&Array[n-1-i][a-1]);
swap(&Array[b-1][i],&Array[b-1][n-1-i]);
}
}
swap(&Array[0][a-1],&Array[0][b-1]);
swap(&Array[a-1][0],&Array[b-1][0]);
swap(&Array[2][0],&Array[2][n-1]);
swap(&Array[0][2],&Array[n-1][2]);
}
break;
case 1:
case 3:
/*穿心对调*/
for(i=0;i<n;i++)
for(j=0;j<n/2;j++)
{
if(i<n/2)
{
if(i%2==1&&Array[i][j]%2==0) /*偶行换偶*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
else if(i%2==0&&Array[i][j]%2==0)/*奇行换奇*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
}
else if(i>n/2)
{
if(i%2==1&&Array[i][j]%2==0)/*偶行换偶*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
else if(i%2==0&&Array[i][j]%2==0)/*奇行换奇*/
{
swap(&Array[i][j],&Array[n-1-i][n-1-j]);
}
}
}
/*End穿心对调*/
/*重排米字*/
for(i=0;i<n;i++)
{
tempArray1[i]=Array[i][i];
tempArray2[i]=Array[a][i];
}

QuickSort(tempArray1,0,n-1);
QuickSort(tempArray2,0,n-1);
for(i=0;i<n;i++)
{
Array[i][i]=tempArray2[i];
Array[a][i]=tempArray1[i];
}
for(i=0;i<n;i++)
{
tempArray1[i]=Array[i][n-1-i];
tempArray2[i]=Array[i][a];
}
QuickSort(tempArray1,0,n-1);
QuickSort(tempArray2,0,n-1);
for(i=0;i<n;i++)
{
Array[i][n-1-i]=tempArray2[i];
Array[i][a]=tempArray1[i];
}
/*End重排米字*/

if(m==3)
{
for(i=0;i<n/2;i++)
{
if((i!=a-1)&&(i!=b-1)&&(i!=a+1))
{
swap(&Array[i][a-1],&Array[n-1-i][a-1]);
swap(&Array[a-1][i],&Array[a-1][n-1-i]);
}
}
swap(&Array[a-1][a-1],&Array[a+1][a+1]);
swap(&Array[a-1][b-1],&Array[a+1][b-1]);
}
break;
default:
break;
}
return;
}

void main()
{
int Ne[MAX_INDEX][MAX_INDEX];
int i,j,n;
while(1)
{
printf("Please Input N (0 quit): ");
scanf("%d",&n);
if(n==0)
break;

/*数组赋初值*/
for(i=0;i<n;i++)
for(j=0;j<n;j++)
Ne[i][j]=i*n+(j+1);

Huanf(Ne,n);

for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf("%-4d",Ne[i][j]);
if(j==n-1)
printf("\n\n");
}
printf("\n\n");
getch();
}
}