我正在创建一个程序来完成3*3魔法方块中缺少的元素。幻方是二维数组n *n,在幻方中,每一行和等于列和,等于对角和。而且,所有的元素都是独一无二的。
这就是一个例子:
2 7 6 2 7 6
9 0 0 ---------> 9 5 1
0 0 0 4 3 8我就是这样做的:
import java.io.*;
class asdf {
public static void main (String[] args) {
int sum = 0;
int index = 0;
int [][]arr = {
{12,17,10},
{11,0,0},
{0,0,0}
} ;
for (int i = 0;i<3;i++){
sum += arr[index][i];
}
arr[2][0] = sum - (arr[0][0]+arr[1][0]);
arr[1][1] = (arr[0][2]+arr[2][0])/2;
arr[1][2] = sum-(arr[1][0]+arr[1][1]);
arr[2][1] = sum - (arr[0][1]+arr[1][1]);
arr[2][2] = sum - (arr[0][2]+arr[1][2]);
for (int i = 0;i<3;i++){
for (int j = 0;j<3;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}但是我认为这种思维方式没有效率,所以我该怎么办呢?
发布于 2020-07-07 09:17:04
通常,这类问题应该通过回溯来解决,但是在幻方的情况下,有一种特殊的模式,可以通过使用索引来实现。这里是java程序。
n:方阵的大小
初始:从哪个数字幻方开始(如它的1)
initialRow/initialCol:初始种子应从哪个位置开始(如1、2)
以下是用javascript编写的相同程序
var n=3;
var initial=1;
var initialRow = 1;
var initialCol = 2;
var a = [[]];
function computeMagicSquare(){
var p = {}
p.row = initialRow;
p.col = initialCol
for(let i=0;i<n;i++){
for(let j=0;j<n;j++){
choosePos(p);
a[p.row][p.col] = initial++;
p.row--;
p.col++;
}
}
}
function choosePos(p){
normalizePos(p);
if(a[p.row][p.col]!=0){
p.row++;
p.col++;
choosePos(p);
}
}
function normalizePos(p){
if(p.row<0){
p.row = n-1;
}
if(p.col<0){
p.col = n-1;
}
p.row = p.row%n;
p.col = p.col%n;
}
function printArray(){
let row;
for(let i=0;i<n;i++){
row = '';
for(let j=0;j<n;j++){
row+=a[i][j]+' ';
}
console.log(row);
}
}
function initializeArray(){
for(let i=0;i<n;i++){
a[i]=[];
for(let j=0;j<n;j++){
a[i][j]=0;
}
}
}
if(n%2==0){
console.log('n should be odd number');
} else {
initializeArray();
computeMagicSquare();
printArray();
}
https://stackoverflow.com/questions/62648947
复制相似问题