689D Magic Odd Square 奇数幻方
2024-10-18 19:24:32
1 奇数阶幻方构造法
(1) 将1放在第一行中间一列;
(2) 从2开始直到n×n止各数依次按下列规则存放:按 45°方向行走,向右上,即每一个数存放的行比前一个数的行数减1,列数加1
(3) 如果行列范围超出矩阵范围,则回绕。例如1在第1行,则2应放在最下一行,列数同样加1;
(4) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<map>
#define INF 0xffffffff
#define MAX 1005
#define Temp 1000000000
#define MOD 1000000007 using namespace std; int Map[MAX][MAX]; void MagicSquare(int n)
{
Map[][(n+)/]=;//首先填第一行中间列 1
int x=,y=(n+)/;
for(int i=;i<=n*n;i++)
{
if(x== && y==n)//若当前位置为(1,n)则下一个数填到当前数字下方
{
x=x+;
y=y;
Map[x][y]=i;
continue;
}
if(y==n)//若超出边界则回绕
{
if(Map[x-][]==-)
{
x=x-;
y=;
Map[x][y]=i;
}
else
{
x=x+;
Map[x][y]=i;
}
continue;
}
if(x==)//若超出边界则回绕
{
if(Map[n][y+]==-)
{
x=n;
y=y+;
Map[x][y]=i;
}
else
{
x=x+;
Map[x][y]=i;
}
continue;
}
else//向右上方填
{
if(Map[x-][y+]!=-)//若右上方已有数字,当前数字填当前位置下方
{
x=x+;
y=y;
Map[x][y]=i;
}
else
{
x=x-;
y=y+;
Map[x][y]=i;
}
continue;
}
}
} int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(Map,-,sizeof(Map));
MagicSquare(n);
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
printf("%d%c",Map[i][j],j==n?'\n':' ');
}
}
}
return ;
}
最新文章
- category中重写方法?
- 扩展jquery的选择器
- [bzoj4551][Tjoi2016][Heoi2016]树
- Java:集合工具类-Collections
- [原创]java WEB学习笔记57:Struts2学习之路---ActionSupport类的说明
- codeforces 258C Little Elephant and LCM 组合数学 枚举
- juce viewport使用
- MSSQL、C# 、Winform、ASP.NET - 数据库备份与还原模块
- [置顶] vs2008 编译adb 支持4.2 android 系统(增加push 命令的进度)
- java连接ms sql server各类问题解析
- spring-mvc报红错误
- J.U.C-三剑客[semaphore\CyclicBarrier\CountDownLatch]
- Spark配置参数详解
- 自动化单元测试工具 EvoSuite 的简单使用 【转载】
- BZOJ - 3676 回文串 (回文树)
- 大型运输行业实战_day11_1_aop理论与aop实际业务操作
- JavaScript常用操作,常用类
- Mysql binlog二进制日志
- php学习七:时间和日期
- (转)Javascript模块化编程(三):Require.js的用法