| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1927 人关注过本帖, 1 人收藏
标题:每日一题!NO.3(适合新手做练习)-幻方问题(已经给出答案!)
取消只看楼主 加入收藏
啊C
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:84
专家分:177
注 册:2010-6-24
结帖率:91.67%
收藏(1)
已结贴  问题点数:1 回复次数:4 
每日一题!NO.3(适合新手做练习)-幻方问题(已经给出答案!)
简单问题:
所谓幻方,就是一个N行N列的正方型,当N为奇数时,称为奇数阶幻方。共有N的平方个格子,将1.2.3.....。N的平方这些数字方到这些格子里,使其每行的和,每列的和及两条对角线的和都是一个相同的数。试编程由键盘输入一个奇数N,输出一个N阶幻方。
请写上注释!
答案明日公布;
图片附件: 游客没有浏览图片的权限,请 登录注册

算法下面的朋友都给出来,其实其他的七种算法可以让已经得到的表格,旋转和对折后再分析算法,但决不是左上或右上这么少,还可以是左下,右下,当然第一个数字的位置也可以变的,可以分析哈,当练习分析能力。
给数的数据,由于排版问题,输入数字大了,就会自动移动到下一行会迫害排版,所以,好输入3以上的输出结果还好自己排版才能更好的观看输出结果!
程序代码:
#include<stdio.h>
#include<stdlib.h>
void main()
{
    int i=0,j,k=1,iold,jold,n,nn[50][50]={0};//定义自变量
    printf("请输入奇数\n");
    scanf("%d",&n);
    if(n%2!=1)//验证输入是不是奇数
    {
        printf("输入的不是奇数\n");
        getchar();
        exit(0);
    }
    j=n/2;
    for(;k<=n*n;k++)//循环添加数字,每下一个数在原来的基础上加1“k++”
    {
        nn[i][j]=k;//填数字在表格里
        iold=i;//记录这次添数字表格的坐标
        jold=j;//
        i=i-1;//向右上移动一格
        j=1+j;//
        if(i<0&&j<n)//判断行是否益处表格,如果益处了,就变成最下行坐标,
        {
            i=n-1;
        }
        else if(i<0&&j>=n)  /*判断行和列是否同时益处表格,如果益处了,行变为最下行坐标,
                            列变为最左边坐标*/
        {
            i=n-1;
            j=0;
        }
        else if(i>=0&&j>=n)//判断列是否单独益处表格,如果益处则变为最左边坐标
        {
            j=0;
        }
        if(nn[i][j]>0)//判断移动后的表格是否已经填入了数据,如果填入了,就不向右上移动,向下移动
        {
            i=iold+1;  //在记录上次的坐标向下移动一个表格
            j=jold;
       
        }

    }
    printf("______________________________\n 第1--4种\n\n");
    for(i=0;i<n;i++)//按照把得到的表格旋转和对撤后,所得到新的7种,
    {              //根据数组正序和倒序的排列输出可以实现

        for(j=0;j<n;j++)
        {
            printf(" %2d",nn[i][j]);
        }
        printf(" \t");
        for(j=n-1;j>=0;j--)
        {
            printf("%3d",nn[i][j]);
        }
        printf(" \t");
        for(j=0;j<n;j++)
        {
            printf("%3d",nn[j][i]);
        }
        printf(" \t");
        for(j=n-1;j>=0;j--)
        {
            printf("%3d",nn[j][i]);
        }
        printf("\n\n");

    }   
    printf("______________________________\n 第5--8种\n\n");
    for(i=n-1;i>=0;i--)
    {
       
        for(j=0;j<n;j++)
        {
            printf("%3d",nn[i][j]);
        }
        printf(" \t");
        for(j=n-1;j>=0;j--)
        {
            printf("%3d",nn[i][j]);
        }
        printf(" \t");
        for(j=0;j<n;j++)
        {
            printf("%3d",nn[j][i]);
        }
        printf(" \t");
        for(j=n-1;j>=0;j--)
        {
            printf("%3d",nn[j][i]);
        }
        printf("\n\n");

    }
    printf("______________________________\n");


}


[ 本帖最后由 啊C 于 2011-6-7 22:32 编辑 ]
搜索更多相关主题的帖子: 格子 编程 对角线 能力 
2011-06-06 19:20
啊C
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:84
专家分:177
注 册:2010-6-24
收藏
得分:0 
今天晚上给代码,一共写出了8种,也就是说有8种算吧,我是使用的是排序不同而实现8种,
有兴趣的朋友可以试试用8种算法来实现!

亲爱的朋友们动起手来吧,让我们一起迈向C语言的世界!
2011-06-07 15:18
啊C
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:84
专家分:177
注 册:2010-6-24
收藏
得分:0 
怎么坑人了啊,是不同的算法嘛!

亲爱的朋友们动起手来吧,让我们一起迈向C语言的世界!
2011-06-07 18:33
啊C
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:84
专家分:177
注 册:2010-6-24
收藏
得分:0 
又过了一天了,本人确实是个菜鸟,每日一题,只是为了和大家一起进步,感谢大家的参与,也谢谢高手们 在里面给我们的算法和例子,每日一题发布的时间和给出答案的时间都是每天晚上10:00左右,也就是我们放学后。

每日一题,不求其它,只求每天我们这些菜鸟有一点进步,集水成渊,集土成山,我相信我们在进步,我们总有一天到了量到质的变化时,可以写自己高级的程序,做自己的系统,有一技能之长。
收到的鲜花
  • voidx2011-06-07 22:42 送鲜花  5朵   附言:强势支持

亲爱的朋友们动起手来吧,让我们一起迈向C语言的世界!
2011-06-07 22:40
啊C
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:84
专家分:177
注 册:2010-6-24
收藏
得分:0 
有趣的思考
以下是引用beyondyf在2011-6-7 21:41:53的发言:

抛砖引玉一下,送大家一个函数
参数的意义:n:幻方的阶数,r:幻方第r行,c:幻方第c列
返回值:n阶幻方第r行第c列的值。其中r,c从0开始计数。
比如说10001阶幻方,打印出来可能不现实,但你可以用这个函数看看它的一部分。
 
另外哪位有兴趣写个逆函数,即已知n阶幻方求某一值所在的行列位置。函数的时间复杂度要求是O(1)。
int MatIndex(int n, int r, int c)
{
    int p, q, s, h;
    h = n >> 1;
    p = r + c - h;
    if(p >= n) p -= n;
    if(p < 0) p += n;
    if(p <= h) q = p << 1; else q = ((p - h - 1) << 1) + 1;
    s = q - r;
    if(s < 0) s += n;
    return p * n + s + 1;
}
很有趣的思考,希望能写哈注释,偶是新手!“<<”这东西不太明白!

亲爱的朋友们动起手来吧,让我们一起迈向C语言的世界!
2011-06-07 22:43
快速回复:每日一题!NO.3(适合新手做练习)-幻方问题(已经给出答案!)
数据加载中...
 
   



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

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