幻方问题__技巧解法
幻方是一种很神奇的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("如果对您有帮助,请不要忘记关注支持一波哦,您的支持就是对我最大的激励!")
幻方问题__技巧解法相关推荐
- [HNUOJ10029] 幻方矩阵(奇数阶幻方的两种解法)
幻方矩阵 Time Limit: 4000ms, Special Time Limit:8000ms, Memory Limit:2048KB Total submit users: 857, Acc ...
- 任意阶幻方解法及c++实现
任意阶幻方的解法及c++实现 在一个由若干个排列整齐的数组成的正方形中,图中任意一横行.一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为"幻方".我国古代称为" ...
- 任意阶幻方的解法及c++实现
任意阶幻方的解法及c++实现 在一个由若干个排列整齐的数组成的正方形中,图中任意一横行.一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为"幻方".我国古代称为" ...
- 10幻方c语言,幻方算法 C语言描述
幻方算法的所有情况描述及C语言表示 2019-03-30 讨论幻方前,先讨论一下动态申请数组大小 众所周知 在C语言中必须指定数组的大小 否则会报错.如果你不知道你要申请多大的数组怎么办?初始化一个非 ...
- c 语言奇数幻方代码,【C】——幻方算法(示例代码)
一.幻方按照阶数可分成了三类,即奇数阶幻方.双偶阶幻方.单偶阶幻方. 二.奇数阶幻方(劳伯法) 奇数阶幻方最经典的填法是罗伯法.填写的方法是: 把1(或最小的数)放在第一行正中:按以下规律排列剩下的( ...
- 幻方构造方法及C语言实现
所谓幻方,就是在一个nXn的正方形中,分别填上1到n*n的数字,使得每行每列以及对角线上的数字之和相等.比如,小学学过的九宫格就属于3阶幻方.幻方最早起源于中国. 对于幻方的求解,首先我们按照其阶数n ...
- 实验报告幻方,数组的排序和向数组中插入某个数
数学与计算机学院 程序设计 实验报告 年级 11级数电二班 学号2011435058 姓名魏珊珊 成绩______ 专业 电气信息类计算机类 实验地点 主楼402 指导教师 石强实验题目学习数 ...
- 幻方算法(Magic Square)
一.幻方按照阶数可分成了三类,即奇数阶幻方.双偶阶幻方.单偶阶幻方. 二.奇数阶幻方(劳伯法) 奇数阶幻方最经典的填法是罗伯法.填写的方法是: 把1(或最小的数)放在第一行正中:按以下规律排列剩下的( ...
- BUU刷题babyheap_0ctf_2017
解题所需知识: 只有这个wp可以打通其他的都不可以!!! [FastBinAttack实战]babyheap_0ctf_2017 – TokameinE babyheap_0ctf_2017 | 堆利 ...
最新文章
- 寻找隐形冠军 支付宝、微信用得那么溜,可谁知道背后有一名“上海功臣
- python判断语句_python条件判断语句if elif else使用
- Sql获取表信息(包括结构及字段说明)
- 无监督学习与监督学习_有监督与无监督学习
- UVA 10054 the necklace 欧拉回路
- HTML使用vue的 event,vue-js 特殊变量$event常识
- 图解Sharepoint2007部署(下):安装sharepoint2007、创建sharepoint2007站点
- 5分钟即可使用25年的Linux
- Android webView嵌套h5页面 软键盘遮盖页面问题 解决方案 java kotlin
- apk加壳加密工具(apk protect) v1.0下载
- SQL的连接查询——内连接、左连接、右连接、自连接(重要)
- 从OSPO 来思考开源治理问题
- 向量 点乘 叉乘求导总结
- 明争暗斗 京东阿里智能家居大战一触即发
- 怎么看两张图片的相似度,测试两张照片相似度
- 扦插机器人_如何看待我国农业采摘机器人发展趋势?
- 小学计算机的一些课题,小学计算机课题研究价值主要体现在什么方面
- Nuki智能锁安全性分析
- 聚焦道路交通安全,《自动驾驶汽车交通安全白皮书》正式发布
- (转) 机器学习很有趣Part6:怎样使用深度学习进行语音识别