幻方是一种很神奇的N*N矩阵:它由数字 1,2,3,......N ×N 构成,且每行、每列及两条对角线上的数字之和都相同。我们有极其暴力的暴力解法,将所有情况穷举出来,如何再进行行、列和对角线判断。当然,解决幻方问题也有的技巧,下面,我给大家带来关于奇数幻方的技巧解法:

当N为奇数时:
首先将 1 写在第一行的中间。之后,按如下方式从小到大依次填写每个数K(K=2,3,...,N*N):
若 (K-1) 在第一行但不在最后一列,则将 K 填在最后一行,(K-1)所在列的右一列;
若 (K-1) 在最后一列但不在第一行,则将 K 填在第一列,(K-1)所在行的上一行;
若 (K-1) 在第一行最后一列,则将 K 填在(K-1)的正下方;
若 (K-1) 既不在第一行,也不在最后一列,如果(K-1)的右上方还未填数,则将 K 填在(K-1)的右上方,否则将 K 填在(K-1)的正下方。

首先初始化,令横坐标为tempx,纵坐标为tempy。首先将 1 写在第一行的中间。

int arry[30][30]={0};//初始化全为0
int m=(n-1)/2;
int tempx=m,tempy=0;

之后,按如下方式从小到大依次填写每个数K(K=2,3,...,N*N),那么关于1的坐标就是:

arry[tempx][tempy]=1; //将第一个为1

若 (K-1) 在第一行但不在最后一列,则将 K 填在最后一行,(K-1)所在列的右一列;

if(tempx!=n-1 && tempy==0)//(K-1) 在第一行但不在最后一列{tempx=tempx+1,tempy=n-1;arry[tempx][tempy]=k;//则将 K 填在最后一行,(K-1)所在列的右一列continue;}

若 (K-1) 在最后一列但不在第一行,则将 K 填在第一列,(K-1)所在行的上一行;

if(tempx==n-1 && tempy!=0)//(K-1) 在最后一列但不在第一行{tempx=0,tempy=tempy-1;arry[tempx][tempy]=k;//则将 K 填在第一列,(K-1)所在行的上一行;continue;}

若 (K-1) 在第一行最后一列,则将 K 填在(K-1)的正下方;

if(tempx==n-1 && tempy==0)//(K-1) 在第一行最后一列{tempx=tempx,tempy=tempy+1;//则将 K 填在(K-1)的正下方arry[tempx][tempy]=k;continue;}

若 (K-1) 既不在第一行,也不在最后一列,如果(K-1)的右上方还未填数,则将 K 填在(K-1)的右上方,否则将 K 填在(K-1)的正下方。

if(tempx!=n-1 && tempy!=0)//(K-1) 既不在第一行,也不在最后一列{if(arry[tempx+1][tempy-1]==0)//果(K-1)的右上方还未填数,则将 K 填在(K-1)的右上方,{tempx=tempx+1,tempy=tempy-1;arry[tempx][tempy]=k;continue;}else//否则将 K 填在(K-1)的正下方{tempx=tempx,tempy=tempy+1;arry[tempx][tempy]=k;continue;}}

最后将整个arry块用for遍历(大家应该都会了)

还是写一下吧(!^_^!)

for(int i=0;i<n;i++) {for(int j=0;j<n;j++){cout<<arry[j][i]<<" ";}cout<<endl;}

下面,完整代码奉上:

#include <iostream>
#include<cstring>
using namespace std;
int main()
{int n,m;cin>>n;int arry[30][30]={0};//初始化全为0 m=(n-1)/2;//1所在的位置int tempx=m,tempy=0;arry[tempx][tempy]=1; //将第一个为1for(int k=2;k<=n*n;k++)//不要用各行和斜对行之积想相等来求幻方 {if(tempx!=n-1 && tempy==0)//(K-1) 在第一行但不在最后一列{tempx=tempx+1,tempy=n-1;arry[tempx][tempy]=k;//则将 K 填在最后一行,(K-1)所在列的右一列continue;}if(tempx==n-1 && tempy!=0)//(K-1) 在最后一列但不在第一行{tempx=0,tempy=tempy-1;arry[tempx][tempy]=k;//则将 K 填在第一列,(K-1)所在行的上一行;continue;}if(tempx==n-1 && tempy==0)//(K-1) 在第一行最后一列{tempx=tempx,tempy=tempy+1;//则将 K 填在(K-1)的正下方arry[tempx][tempy]=k;continue;}if(tempx!=n-1 && tempy!=0)//(K-1) 既不在第一行,也不在最后一列{if(arry[tempx+1][tempy-1]==0)//果(K-1)的右上方还未填数,则将 K 填在(K-1)的右上方,{tempx=tempx+1,tempy=tempy-1;arry[tempx][tempy]=k;continue;}else//否则将 K 填在(K-1)的正下方{tempx=tempx,tempy=tempy+1;arry[tempx][tempy]=k;continue;}}}for(int i=0;i<n;i++)//打印数组中的元素 {for(int j=0;j<n;j++){cout<<arry[j][i]<<" ";}cout<<endl;}return 0;
}

for i in range(0,1000):

print("如果对您有帮助,请不要忘记关注支持一波哦,您的支持就是对我最大的激励!")

幻方问题__技巧解法相关推荐

  1. [HNUOJ10029] 幻方矩阵(奇数阶幻方的两种解法)

    幻方矩阵 Time Limit: 4000ms, Special Time Limit:8000ms, Memory Limit:2048KB Total submit users: 857, Acc ...

  2. 任意阶幻方解法及c++实现

    任意阶幻方的解法及c++实现 在一个由若干个排列整齐的数组成的正方形中,图中任意一横行.一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为"幻方".我国古代称为" ...

  3. 任意阶幻方的解法及c++实现

    任意阶幻方的解法及c++实现 在一个由若干个排列整齐的数组成的正方形中,图中任意一横行.一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为"幻方".我国古代称为" ...

  4. 10幻方c语言,幻方算法 C语言描述

    幻方算法的所有情况描述及C语言表示 2019-03-30 讨论幻方前,先讨论一下动态申请数组大小 众所周知 在C语言中必须指定数组的大小 否则会报错.如果你不知道你要申请多大的数组怎么办?初始化一个非 ...

  5. c 语言奇数幻方代码,【C】——幻方算法(示例代码)

    一.幻方按照阶数可分成了三类,即奇数阶幻方.双偶阶幻方.单偶阶幻方. 二.奇数阶幻方(劳伯法) 奇数阶幻方最经典的填法是罗伯法.填写的方法是: 把1(或最小的数)放在第一行正中:按以下规律排列剩下的( ...

  6. 幻方构造方法及C语言实现

    所谓幻方,就是在一个nXn的正方形中,分别填上1到n*n的数字,使得每行每列以及对角线上的数字之和相等.比如,小学学过的九宫格就属于3阶幻方.幻方最早起源于中国. 对于幻方的求解,首先我们按照其阶数n ...

  7. 实验报告幻方,数组的排序和向数组中插入某个数

    数学与计算机学院 程序设计 实验报告 年级 11级数电二班 学号2011435058  姓名魏珊珊 成绩______ 专业 电气信息类计算机类 实验地点 主楼402  指导教师 石强实验题目­­学习数 ...

  8. 幻方算法(Magic Square)

    一.幻方按照阶数可分成了三类,即奇数阶幻方.双偶阶幻方.单偶阶幻方. 二.奇数阶幻方(劳伯法) 奇数阶幻方最经典的填法是罗伯法.填写的方法是: 把1(或最小的数)放在第一行正中:按以下规律排列剩下的( ...

  9. BUU刷题babyheap_0ctf_2017

    解题所需知识: 只有这个wp可以打通其他的都不可以!!! [FastBinAttack实战]babyheap_0ctf_2017 – TokameinE babyheap_0ctf_2017 | 堆利 ...

最新文章

  1. 寻找隐形冠军 支付宝、微信用得那么溜,可谁知道背后有一名“上海功臣
  2. python判断语句_python条件判断语句if elif else使用
  3. Sql获取表信息(包括结构及字段说明)
  4. 无监督学习与监督学习_有监督与无监督学习
  5. UVA 10054 the necklace 欧拉回路
  6. HTML使用vue的 event,vue-js 特殊变量$event常识
  7. 图解Sharepoint2007部署(下):安装sharepoint2007、创建sharepoint2007站点
  8. 5分钟即可使用25年的Linux
  9. Android webView嵌套h5页面 软键盘遮盖页面问题 解决方案 java kotlin
  10. apk加壳加密工具(apk protect) v1.0下载
  11. SQL的连接查询——内连接、左连接、右连接、自连接(重要)
  12. 从OSPO 来思考开源治理问题
  13. 向量 点乘 叉乘求导总结
  14. 明争暗斗 京东阿里智能家居大战一触即发
  15. 怎么看两张图片的相似度,测试两张照片相似度
  16. 扦插机器人_如何看待我国农业采摘机器人发展趋势?
  17. 小学计算机的一些课题,小学计算机课题研究价值主要体现在什么方面
  18. Nuki智能锁安全性分析
  19. 聚焦道路交通安全,《自动驾驶汽车交通安全白皮书》正式发布
  20. (转) 机器学习很有趣Part6:怎样使用深度学习进行语音识别

热门文章

  1. 常见的深度学习图像处理数据集下载
  2. ESP32S3蓝牙学习系列---Beacon信标之Eddystone
  3. docker 及docker compose笔记
  4. 如何提高自己的专注度
  5. pika的原理和实现
  6. 电子商务网站的系统规划-1
  7. 洛谷刷题P1914 小书童——凯撒密码(c语言)
  8. jQuery对Ajax的升级简化
  9. 计算机科学与技术与光电,光电信息科学与工程考研科目有哪些?
  10. 【教程】迅为iTOP-4412精英版exynos4412开发板搭建原生Linux最小系统(一)