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

推荐订阅源

W
WeLiveSecurity
T
The Exploit Database - CXSecurity.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
腾讯CDC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
F
Full Disclosure
博客园 - 【当耐特】
C
CERT Recently Published Vulnerability Notes
Engineering at Meta
Engineering at Meta
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Threatpost
I
Intezer
V2EX - 技术
V2EX - 技术
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Hacker News
The Hacker News
小众软件
小众软件
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
N
News | PayPal Newsroom
MyScale Blog
MyScale Blog
AI
AI
Vercel News
Vercel News
Spread Privacy
Spread Privacy
美团技术团队
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
V
Vulnerabilities – Threatpost
Schneier on Security
Schneier on Security
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
Help Net Security
Help Net Security
Hacker News: Ask HN
Hacker News: Ask HN
Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
L
LINUX DO - 热门话题
U
Unit 42
L
LangChain Blog
Recent Announcements
Recent Announcements

博客园 - 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;
}