求输出"魔法阵"的方法,谢谢!
											魔法阵即它的每一行每一列和对角线之和均相等,例如三阶魔法阵为8 1 6
3 5 7
4 9 2
要求输出1-n^2的自然数构成的魔法阵
有些n没有对应的魔法阵 如 n=2时
n最好可以手动输入 如果n对应的魔法阵不存在则输出"不存在" 不可以手动输入的话也行
求答案 我已经搞了1个多小时了 米有结果啊>..我是臭皮匠,求诸葛亮
谢谢! 新手 入不敷出 没啥子分 你就做个好人吧 大虾
 程序代码:
程序代码:#include <stdio.h>
#include <stdafx.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();
}
}
刚刚在论坛里找的										
					
	
 程序代码:
程序代码:#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define MAX_ROWS_COLS    80
void print_magic_square(int (* pms)[MAX_ROWS_COLS], int n) {
    int  i, j;
    int  width = (int)log10((double)(n * n)) + 2;
    char format[] = "%-xd";
    format[2] = width + '0';
    for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
            printf(format, pms[i][j]);
            pms[i][j] = 0;
        }
        printf("\n");
    }
}
int main(void) {
    int ms[MAX_ROWS_COLS][MAX_ROWS_COLS] = {0};
    int n, i, j, count;
    while(scanf("%d", &n) != EOF) {
        if(n < 1 || n > MAX_ROWS_COLS || n % 2 == 0) {
            printf("Error, please try again!\n");
            continue;
        } else {
            for(i = 0, j = n / 2, count = 1; count <= n * n; count++) {
                if(i == -1 && j == n) {
                    i += 2;
                    j -= 1;
                } else if(i == -1) {
                    i += n;
                } else if(j == n) {
                    j -= n;
                } else if(ms[i][j]) {
                    i += 2;
                    j -= 1;
                }
                ms[i][j] = count;
                i--; j++;
            }
            print_magic_square(ms, n);
        }
    }
    system("pause");
    return 0;
}										
					
	