华师一附中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> 使用
# include <iostream>
# include <iomanip>
using namespace std;
const int n=7;
int a[n][n];
int r,c,i,j,k,tr,tc;
int main()
{
r=0;c=n/2;k=1;a[r][c]=k;
while (k<=n*n)
{
tr=r-1;tc=c+1;
if (tr<0) tr=n-1;
if (tc>n-1) tc=0;
if (a[tr][tc]!=0) {tr=r+1;tc=c;}
r=tr;c=tc;k++;a[r][c]=k;
}
for (r=0;r<=n-1;r++)
{for (c=0;c<=n-1;c++) cout<<setw(3)<<a[r][c];
cout<<endl;
}
}
复制代码
作者:
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