주어진 에지 길이 (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 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);
}
}
http://en.wikipedia.org/wiki/Magic_square#Types_and_construction을 읽으셨습니까? –
그래, 내가 읽었지만, 내가 찾고있는 솔루션은 더 간단하다. 나는 알고리즘을 최적화하고 싶다. – mate1229