| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1927 人关注过本帖, 1 人收藏
标题:每日一题!NO.3(适合新手做练习)-幻方问题(已经给出答案!)
只看楼主 加入收藏
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
楼主该不会是用 4 个不同的方向写 4 种不同的代码吧,那就有点坑爹了
2011-06-07 16:06
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 9楼 草狼
    square[i][j] = (N+1-i) * N -j + 1;
            else
                square[i][j] = (i - 1) * N + j;
这个后面的公式是怎么来的?  有什么依据嘛  讲一下

                                         
===========深入<----------------->浅出============
2011-06-07 16:52
啊C
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:84
专家分:177
注 册:2010-6-24
收藏
得分:0 
怎么坑人了啊,是不同的算法嘛!

亲爱的朋友们动起手来吧,让我们一起迈向C语言的世界!
2011-06-07 18:33
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 13楼 啊C
先把代码贴上来嘛,我也只是开玩笑,楼主别认真
2011-06-07 18:34
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
收藏
得分:0 
虽然是 8个 排列法,但是规律都是类似的,洛书口诀,从1开始,要吗右上下,要麻左下上。

Q:1428196631,百度:开发地 即可找到我,有事请留言!
2011-06-07 19:40
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
收藏
得分:0 
程序代码:
#include <iostream>
using namespace std;
int main()
{
    int i,j,m=1,n,a[11][11];
    cout<<"请输入1-11的奇数"<<endl;
    while(1)
    {
      cin>>n;                       //获取输入值,为一个奇数
      if(n%2==0 || n>11 )  //对输入数据进行验证
      {cout<<"输入超出范围或不是奇数,请重输!"<<endl;continue;}
      else
      {break;}
    }
    i=0,j=n/2;           //定义首排列地址,也就是从1开始放数,把1放在第1行,中间列,当然也可以有其他排法,只要遵循洛书口诀即可!   下面就要对数组赋值,让它符合3值和相等。
    while(m<=n*n)  //定义最大数,N*N,M就是要放到二維数组里的数,从1开始排放!在这里是向上右方向排列,遇到N的整倍数,下一个m值放下面!
    {
        a[i][j]=m;        //开始放数,最开始M是1,所有把1放进去,之后自增!
        m++,i--,j++;          //行数向上移动,列数向右移动。所以是i--,j++,
        if((m-1)%n==0&&m>=1)   //当M的值为N的整数倍,并且其值大于等于1的时候,把行和列规位,这里可能不好理解。注意上句执行了i--,j++,也就是位置已经改变了。
        i+=2,j--;        

        if(i<0) i=n-1;                        //超过上边界,回档,也就是第一行继续向上移就转到了最下面一行!
        if(j>(n-1)) j=0;                     //超过右边界,回档,最后一列转到最前面一列。
    }
    for(i=0;i<n;i++)                   //循环打印出二維数组值!
        {
           for(j=0;j<n;j++)
           {
           cout.width(5);
           cout<<a[i][j]<<" ";
           }
        cout<<"\n"<<endl;
        }
return 0;
}
用C++编译器,编译通过!具体算法看洛书口诀!

Q:1428196631,百度:开发地 即可找到我,有事请留言!
2011-06-07 20:20
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
抛砖引玉一下,送大家一个函数
参数的意义: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;
}

重剑无锋,大巧不工
2011-06-07 21:41
blackbansy
Rank: 2
等 级:论坛游民
帖 子:18
专家分:14
注 册:2011-6-6
收藏
得分:0 
三楼的不对吧,每一列的和不等哦

抽空开了个店铺,欢迎大家前往参观。店名: 衣省无忧
2011-06-07 21:55
gupiao175
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:40
帖 子:1787
专家分:7527
注 册:2007-6-27
收藏
得分:0 
偶数的好像只有4N阶可以有解法,4,8,12。其他偶数好像还没见过可以的。

Q:1428196631,百度:开发地 即可找到我,有事请留言!
2011-06-07 22:30
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 19楼 gupiao175
维基上有算法
2011-06-07 22:32
快速回复:每日一题!NO.3(适合新手做练习)-幻方问题(已经给出答案!)
数据加载中...
 
   



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

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