华师一附中OI组

标题: 奇数阶幻方问题 [打印本页]

作者: diggersun    时间: 2014-11-18 18:35
标题: 奇数阶幻方问题
本帖最后由 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. }

复制代码




作者: diggersun    时间: 2014-11-18 18:39
巧妙一点的做法是第12行改成tr=(r+n-1)%n;tc=(c+1)%n;
这个的意思就是将无限的空间进行折叠。非常有用




欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2