| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1039 人关注过本帖, 1 人收藏
标题:求输出"魔法阵"的方法,谢谢!
只看楼主 加入收藏
zh77
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:84
专家分:22
注 册:2011-8-5
结帖率:100%
收藏(1)
已结贴  问题点数:4 回复次数:8 
求输出"魔法阵"的方法,谢谢!
魔法阵即它的每一行每一列和对角线之和均相等,例如三阶魔法阵为
8 1 6
3 5 7
4 9 2
要求输出1-n^2的自然数构成的魔法阵
有些n没有对应的魔法阵  如 n=2时
n最好可以手动输入 如果n对应的魔法阵不存在则输出"不存在" 不可以手动输入的话也行
求答案 我已经搞了1个多小时了 米有结果啊>..我是臭皮匠,求诸葛亮
谢谢!  新手 入不敷出 没啥子分 你就做个好人吧 大虾
搜索更多相关主题的帖子: 诸葛亮 自然数 对角线 米有 最好 
2011-08-12 16:38
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:2 
程序代码:
#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();
}
}
刚刚在论坛里找的

                                         
===========深入<----------------->浅出============
2011-08-12 18:22
a9517495424
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:305
专家分:139
注 册:2011-7-20
收藏
得分:0 
这个在数学上也比较难计算的题、、、用循环来推的话,如果很大的数,那不累死计算机?
2011-08-12 22:14
zh77
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:84
专家分:22
注 册:2011-8-5
收藏
得分:0 
回复 2楼 laoyang103
谢谢!  你好厉害哦   我在好多帖子上都看到你回答   能 加我Q吗773058464
2011-08-12 22:48
zh77
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:84
专家分:22
注 册:2011-8-5
收藏
得分:0 
回复 2楼 laoyang103
第二个include要去掉 才能运行  不然 我报错 有bug  n=2 的时候没有答案 不过 我已经相当相当佩服了  这个代码 不仅实现了那个功能 而且 效率很高 果然C的世界里 高手如云啊!!!不好好学 不行啊!!
2011-08-12 22:57
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 5楼 zh77
这个代码是我找的  不是我写的 我可写不出效率这么高的代码

                                         
===========深入<----------------->浅出============
2011-08-13 08:41
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
收藏
得分:0 
程序代码:
#define n 5
int a[n][n]={0},i,j,sum=0,p;
i=0,j=n/2;
while(sum<n*n+1)
{if(i<0&&j>=n)
{i=i+2;j--;}
else{
if(i<0)
i=n-1;
if(j>n-1)
j=0;}
if(!a[i][j])
a[i][j]=++sum;
else {i++;i++;j--;
continue;}
i--;j++;
}
for(i=0;i<n;i++)
{for(j=0;j<n;j++)
printf("%5d",a[i][j]);
printf("\n");}
2011-08-13 08:49
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:2 
程序代码:
#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;
}

My life is brilliant
2011-08-13 10:45
zh77
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:84
专家分:22
注 册:2011-8-5
收藏
得分:0 
回复 8楼 lz1091914999
貌似 n为偶数 的时候...........除了2应该都可以吧   谢谢了!
2011-08-13 15:32
快速回复:求输出"魔法阵"的方法,谢谢!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024060 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved