惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
S
Securelist
D
Docker
The Register - Security
The Register - Security
GbyAI
GbyAI
Recorded Future
Recorded Future
Engineering at Meta
Engineering at Meta
Stack Overflow Blog
Stack Overflow Blog
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
罗磊的独立博客
博客园 - 【当耐特】
F
Full Disclosure
WordPress大学
WordPress大学
腾讯CDC
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
SecWiki News
SecWiki News
L
Lohrmann on Cybersecurity
I
InfoQ
MyScale Blog
MyScale Blog
量子位
Cyberwarzone
Cyberwarzone
博客园 - 三生石上(FineUI控件)
The Hacker News
The Hacker News
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
博客园_首页
H
Help Net Security
K
Kaspersky official blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Webroot Blog
Webroot Blog
Blog — PlanetScale
Blog — PlanetScale
V
Vulnerabilities – Threatpost
Y
Y Combinator Blog
The Cloudflare Blog
P
Proofpoint News Feed
V
Visual Studio Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
爱范儿
爱范儿
P
Privacy International News Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
The GitHub Blog
The GitHub Blog
C
Cybersecurity and Infrastructure Security Agency CISA
B
Blog RSS Feed

博客园 - Shark Xu

我的英雄梦和家国情怀——写于2021年国庆前夕 自己制作的粉碎机批处理程序 Ubuntu 16.10 server 相关 android sdk manager 假如不能从官方下载或者很慢,可以参照下面的网址 HttpModule生命周期示意图 Windows 2012 安装 .net framework 3.5 在Windows 2008/2008 R2 上配置IIS 7.0/7.5 故障转移集群 11G RAC 中 OCR 及Voting Disk 相关操作 RHEL 6 或者 Oracle Linux 6, 不关机识别新添加的scsi硬盘 在Window下安装Oracle 12C Cloud Control Agent 如何修改 EM12c 中 SYSMAN 用户的密码? 在Oracle Linux Server release 6.4下配置ocfs2文件系统 whoami 和 Who am i 手动升级11.2.0.1的rac数据库到11.2.0.4 oracle 11G rac 11.2.0.1 打补丁9413827 oracle 11g 使用物化视图远程增量刷新数据 ORACLE 11.2.0.4 OCR VOTING DISK 模拟恢复场景 Oracle Enterprise Linux 6.4 下配置vncserver Oracle Enterprise Linux 6.4 下挂载ISCSI 设备
幻方算法
Shark Xu · 2017-11-30 · via 博客园 - Shark Xu

一、算法

   1、总算法

           

          2、四阶幻方算法

                 

        3、奇数阶幻方算法

             

              4、偶数阶幻方算法

                    

二、代码

function createMagicSquare(factor,firstNum) {
var component = {};
//阶数
if(factor < 3){
alert("幻方阶数必须大于3");
return null;
}
component.factor = factor;
component.rows = new Array(); //
if(isNaN(firstNum))
firstNum = 1;
component.firstNum = firstNum;
//return;
(function () { //初始化自执行
for(var i = 0;i <component.factor;i++ ){
var numPerRow= new Array();
for(var j = 0;j <component.factor;j++){
numPerRow.push(0);
}
component.rows.push(numPerRow);
}
}());
//return;
//幻方平衡
component.balance = function () {
if(component.factor == 4){
_balance4(component);
}
else if(component.factor % 2 == 0){
_balanceEven(component);
}
else{
_balanceOdd(component);
}
};
//偶数阶幻方平衡
function _balanceEven(magicEvem){
var factor = magicEvem.factor;
var firstNum = magicEvem.firstNum;
if(factor%2 == 0){
//分区域算平衡
var sonFactor = factor/2;
var areaA = createMagicSquare(sonFactor,firstNum);
areaA.balance();
//areaA.show();
var areaB = createMagicSquare(sonFactor,firstNum + sonFactor * sonFactor);
areaB.balance();
//areaB.show();
var areaC = createMagicSquare(sonFactor,firstNum + 2*sonFactor * sonFactor);
areaC.balance();
//areaC.show();
var areaD = createMagicSquare(sonFactor,firstNum + 3*sonFactor * sonFactor);
areaD.balance();
//areaD.show();

//A,B,C,D 平衡算好后,交换数字
if(sonFactor%2 ==0){
//A <----> D相应位置交换,每行的交换方格数为subFactor/2
var exchangeNum = sonFactor/2;
for(var i = 0; i < sonFactor; i++){
for( j =0; j < exchangeNum;j++){
// A<---->D
var temp = areaA.rows[i][j];
areaA.rows[i][j] = areaD.rows[i][j];
areaD.rows[i][j] = temp;
// C<---->B
var temp = areaC.rows[i][j];
areaC.rows[i][j] = areaB.rows[i][j];
areaB.rows[i][j] = temp;
}
}
}
else{
var exchangeNum = (sonFactor - 1)/2;
for(var i = 0; i < sonFactor; i++){
for( j =0; j < exchangeNum;j++){
// A<---->D
var temp = areaA.rows[i][j];
areaA.rows[i][j] = areaD.rows[i][j];
areaD.rows[i][j] = temp;
if(j < exchangeNum - 1) {
// C<---->B
var temp = areaC.rows[i][j];
areaC.rows[i][j] = areaB.rows[i][j];
areaB.rows[i][j] = temp;
}
}
}
}

//交换完了,要把数字连成一片,连接A区
for(i = 0; i<sonFactor; i++){
var currentRow = magicEvem.rows[i];
for(j = 0; j<sonFactor; j++){
currentRow[j] = areaA.rows[i][j];
}
}
delete areaA.rows;
//连接C区
for(i = 0; i<sonFactor; i++){
var currentRow = magicEvem.rows[i];
for(j = 0; j<sonFactor; j++){
currentRow[sonFactor + j] = areaC.rows[i][j];
}
}
delete areaC.rows;
//连接D区
for(i = 0; i<sonFactor; i++){
var currentRow = magicEvem.rows[i + sonFactor];
for(j = 0; j<sonFactor; j++){
currentRow[j] = areaD.rows[i][j];
}
}
delete areaD.rows;
//连接B区
for(i = 0; i<sonFactor; i++){
var currentRow = magicEvem.rows[i + sonFactor];
for(j = 0; j<sonFactor; j++){
currentRow[sonFactor + j] = areaB.rows[i][j];
}
}
delete areaB.rows;
}
};
//奇数阶幻方平衡
function _balanceOdd (magicOdd){
if(magicOdd.factor%2 == 0)
{
alert("必须是奇数阶");
return;
}
var row = 0;
var col = (magicOdd.factor - 1)/2;
var currentNum = magicOdd.firstNum;
magicOdd.rows[row][col] = currentNum;
//document.write("<br/> factor: " + magicOdd.factor + " row:" + (row +1) + " col:" + (col +1) + " --- " + currentNum);
while(currentNum < magicOdd.firstNum + magicOdd.factor * magicOdd.factor - 1)
{
currentNum++;
row = row -1;
col = col + 1;
if(row < 0 )
{
if(col >= magicOdd.factor) { // 在本幻方外部的右上角
row = 1;
col = col - 1;
}
else
{
row = magicOdd.factor - 1;
}
}
else
{
if(col >= magicOdd.factor) { //仅仅超出右边界
col = 0;
}
else
{
//判断格子有没有被占
if(magicOdd.rows[row][col] != 0){
row = row +2;
col = col -1;
}
}
}
if(currentNum>=70)
debugger;
//document.write("<br/>row:" + (row +1) + " col:" + (col +1) + " --- " + currentNum);
magicOdd.rows[row][col] = currentNum;
}
};
//四阶幻方
//startx ==
function _balance4(magic4) {
if(magic4.factor != 4)
{
alert("必须是4阶");
}
for(var i = 0;i <4;i++ ){
var currentRow = component.rows[i];
for(var j = 0;j <4;j++){
currentRow[j] = component.firstNum + i * component.factor + j;
}
}
var temp = magic4.rows[3][3]; //本四阶里最后一行最后一个数字
magic4.rows[3][3] = magic4.rows[0][0];
magic4.rows[0][0] = temp;
temp = magic4.rows[3][0];
magic4.rows[3][0] = magic4.rows[0][3];
magic4.rows[0][3] = temp;

temp = magic4.rows[1][1];
magic4.rows[1][1] = magic4.rows[2][2];
magic4.rows[2][2] = temp;

temp = magic4.rows[1][2];
magic4.rows[1][2] = magic4.rows[2][1];
magic4.rows[2][1] = temp;
}

component.show = function () {
document.write("<table style='border-width: 1px'>")
for(var i = 0; i< component.factor;i++){
document.write("<tr>")
for(var j = 0; j< component.factor;j++){
document.write("<td>")
document.write(component.rows[i][j]);
document.write("</td>")
}
document.write("</tr>")
}
document.write("</table>")
}
return component;
}