华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1541|回复: 3
打印 上一主题 下一主题

奇数阶幻方问题

[复制链接]

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
跳转到指定楼层
楼主
发表于 2014-11-18 18:35:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 diggersun 于 2014-11-18 18:37 编辑

1、将1放在首行正中
2、下一次数字原则上放在上一个
     数字的右上方  R--  C++
   但是,若越界了,类似铺地砖方式(??)
   若右上方有数字,则改放在正下方
3、只到 n*n被放下去为止

准备: 定义一个n*n的数组。
1、首行 r=0 c=n/2
2、右上方怎么表示  r--,c++
3、若有数字,怎么表示 a[r][c]!=0;
4、正下方 r++ c不变

setw设置场宽,要配合# include <iomanip> 使用

  1. # include <iostream>
  2. # include <iomanip>
  3. using namespace std;
  4. const int n=7;
  5. int a[n][n];
  6. int r,c,i,j,k,tr,tc;
  7. int main()
  8. {
  9.     r=0;c=n/2;k=1;a[r][c]=k;
  10.     while (k<=n*n)
  11.     {
  12.         tr=r-1;tc=c+1;
  13.         if (tr<0) tr=n-1;
  14.         if (tc>n-1) tc=0;
  15.         if (a[tr][tc]!=0) {tr=r+1;tc=c;}
  16.         r=tr;c=tc;k++;a[r][c]=k;
  17.     }
  18.     for (r=0;r<=n-1;r++)
  19.         {for (c=0;c<=n-1;c++) cout<<setw(3)<<a[r][c];
  20.          cout<<endl;
  21.         }
  22. }

复制代码



回复

使用道具 举报

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
沙发
 楼主| 发表于 2014-11-18 18:39:21 | 只看该作者
巧妙一点的做法是第12行改成tr=(r+n-1)%n;tc=(c+1)%n;
这个的意思就是将无限的空间进行折叠。非常有用
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-26 03:05 , Processed in 0.203703 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表