优化需要帮助-在java中生成幻方
我必须实现一个算法,为给定的边长度(n=3,4)创建所有可能的幻方。对于n=3,该算法运行良好。但是对于n=4,该算法不会得到任何结果,因为它不是最优的(太慢)。我试图优化算法,但它仍然不能正常工作。 非常感谢您的帮助优化需要帮助-在java中生成幻方,java,memory,optimization,recursion,magic-square,Java,Memory,Optimization,Recursion,Magic Square,我必须实现一个算法,为给定的边长度(n=3,4)创建所有可能的幻方。对于n=3,该算法运行良好。但是对于n=4,该算法不会得到任何结果,因为它不是最优的(太慢)。我试图优化算法,但它仍然不能正常工作。 非常感谢您的帮助 public class MagicSquare { private int[][] square; private boolean[] possible; private int totalSqs; private int sum; private static int nu
public class MagicSquare {
private int[][] square;
private boolean[] possible;
private int totalSqs;
private int sum;
private static int numsquares;
public MagicSquare(int n){
square = new int[n][n];
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
square[i][j] = 0;
}
}
totalSqs = n*n;
possible = new boolean[totalSqs];
for(int i=0; i<totalSqs; i++)
possible[i] = true;
sum = n*(n*n+1)/2;
numsquares = 0;
fill(0, 0);
}
public void fill(int row, int col){
for(int i=0; i<totalSqs; i++){
if(possible[i]){
square[row][col] = i+1;
possible[i] = false;
int newcol = col+1;
int newrow = row;
if(newcol == square.length){
newrow++;
newcol = 0;
}
fill(newrow,newcol);
square[row][col] = 0;
possible[i] = true;
}
}
if(!checkRows() || !checkCols())
return;
if(row == square.length){
for(int i=0; i<square.length; i++ ){
for(int j=0; j<square[i].length; j++){
System.out.print(square[i][j]+" ");
}
System.out.println();
}
System.out.println();
numsquares++;
return;
}
}
public boolean checkRows(){
for(int i=0; i<square.length; i++){
int test = 0;
boolean unFilled = false;
for(int j=0; j<square[i].length; j++){
test += square[i][j];
if(square[i][j] == 0)
unFilled = true;
}
if(!unFilled && test!=sum)
return false;
}
return true;
}
public boolean checkCols(){
for(int j=0; j<square.length; j++){
int test = 0;
boolean unFilled = false;
for(int i=0; i<square[j].length; i++){
test += square[i][j];
if(square[i][j] == 0)
unFilled = true;
}
if(!unFilled && test!=sum)
return false;
}
return true;
}
public static void main(String[] args) {
new MagicSquare(3);
System.out.println(numsquares);
}
公共类MagicSquare{
私人国际[][]广场;
私有布尔[]可能;
私人整数;
私人整数和;
私有静态整数平方;
公共魔法广场(国际北){
平方=新整数[n][n];
对于(int i=0;i您可以引入其他数组来跟踪行、列和2条对角线上的和。每当您在正方形中放置一个新数字或从中删除一个数字时,您需要更新这些和。请注意,当您有奇数维时,中间的数字属于两条对角线,因此两条对角线都属于这两条对角线这些数字需要更新
您有4个案例:
您的行几乎满了(例如,维度是3,第一行中已经有2个数字。然后您不必猜第三个数字,您可以通过从幻数和中减去第一行的和得到它,这取决于维度)
(特定情况)您有最后一行几乎满,最后一列几乎满,以及第一个对角线几乎满(第一列作为从左上角元素开始到右下角元素结束的列)。这基本上是幻方中的最后一个位置
您的列几乎已满
(特定情况)第一列几乎满了,因此第二列也几乎满了(第二列是从右上角元素开始到左下角元素结束的列)
(+1)普通案件
在每种情况下,您都可以减少回溯,因为您不必猜测丢失的数字。这可以减少所需的时间
也可以,如果你把元素插入对角线上,然后在其他位置上插入,这会给你额外的时间,因为对角线上出现的错误最多。如果你真的想要很快,考虑写C/C++的代码。< /p>你读过吗?是的,我已经读过了,但是我所寻找的解决方案更简单,我只想选择。使我的算法无效。。。