| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 535 人关注过本帖
标题:大家帮我看下这道题
只看楼主 加入收藏
温顾
Rank: 2
等 级:论坛游民
帖 子:28
专家分:21
注 册:2011-8-6
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:6 
大家帮我看下这道题
                                                                                                  8 1 6
输出“魔方阵”,所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等。例如,三阶魔方阵为3 5 7 要求输出1到n的平方的自然数构成的魔方阵                                                                                                4 9 2
搜索更多相关主题的帖子: 自然数 对角线 
2011-08-09 22:15
じ☆ve.·°
Rank: 2
等 级:论坛游民
帖 子:52
专家分:51
注 册:2011-2-3
收藏
得分:10 
这个也是论坛里的,希望楼主不是在直接问答案。。
程序代码:
#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-09 22:29
温顾
Rank: 2
等 级:论坛游民
帖 子:28
专家分:21
注 册:2011-8-6
收藏
得分:0 
回复 2楼 じ☆ve.·°
是我课后的一个题 我想不出来 这个怎么呢这么烦啊 有些我都看不懂啊
2011-08-09 22:32
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
收藏
得分:10 
   思路清楚就OK了,给楼主提供一个思路:首先方阵的长要为奇数(偶数不行),把1放在第一行的中间,然后依次把后面的数放在前一个数位置的左上方第一格,超出范围的(就是位置小于0)加上方阵长得到新位置放置,依次放完极为所得
2011-08-10 00:51
温顾
Rank: 2
等 级:论坛游民
帖 子:28
专家分:21
注 册:2011-8-6
收藏
得分:0 
回复 4楼 loveshuang
还是不是太懂 我在看看
2011-08-10 10:42
温顾
Rank: 2
等 级:论坛游民
帖 子:28
专家分:21
注 册:2011-8-6
收藏
得分:0 
回复 4楼 loveshuang
大哥 你能帮我看下这样为什么得不到结果吗
#include <stdio.h>
int main()
{
    int a[15][15],i,j,k,n,count=0;
    printf("please input a number under 15:\n");
    scanf("%d\n",&n);
    while(n>1&&n<=15&&n%2!=0)
    {
        i=0;
        j=(n-1)/2;
        for(k=1;k<=n*n;k++)
        {
            a[i][j]=k;
            i-=1;
            j+=1;
            if(i<0)
                i+=n;
            if(j>n-1)
                j-=n;
        
        }
        for(i=0;i<=n-1;i++)
            for(j=0;j<=n-1;j++)
           {
            printf("%5d",a[i][j]);
            count++;
            if(count%n==0)
              {
                printf("\n");
                count=0;
               }
            }

    }

}
2011-08-11 18:08
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
收藏
得分:0 
#include <stdio.h>
//#include <stdlib.h>
#include <windows.h>
#define MAX 50

void main()
{
    system("title,魔方排数");
    printf("输入魔方的边,排出的方形数组中使每行、每列、对角线的元素之和都相等\n\n");
    int a[MAX][MAX]={0};
    int row;
    printf("输入魔方的边(要小于%d,且为奇数):",MAX);
    while(1)
    {
        scanf("%d",&row);
        if(row>MAX||row%2==0)
        {
            printf("输入值不正确,请重输:");
            continue;
        }
        else
            break;
    }
   
    int r=0;
    int c=row/2;
    a[r][c]=1;      //把1放在第一行的中间
    int i=0;
    int j=row/2;    //把位置指针设置到1的位置
    for(int num=2;num<=row*row;num++)
    {
        i=r-1;
        j=c-1;           //找前一元素的左上方位置:行、列各减一
        if(i<0)i=row-1;  //如果减一后小于0则加上长,(一般减一后小于0只能为-1,所以row-1)
        if(j<0)j=row-1;

        if(a[i][j]!=0)     //如果那个位置有元素了就上移一格
        {
            i=(i+1)%row;
        }
        r=i;c=j;   
        a[i][j]=num;       //放置
        
    }

    for(i=0;i<row;i++)
    {
        for(j=0;j<row;j++)
            printf("%5d",a[i][j]);
        printf("\n");
            
    }
}
2011-08-12 10:23
快速回复:大家帮我看下这道题
数据加载中...
 
   



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

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