-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMagicSquare.java
More file actions
163 lines (129 loc) · 4.06 KB
/
MagicSquare.java
File metadata and controls
163 lines (129 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
import java.util.Scanner;
public class MagicSquare {
public void odd(int[][] magic){
int N = magic.length;
int row = N-1;
int col = N/2;
magic[row][col] = 1;
for(int i = 2; i<=N*N; i++){
if(magic[(row+1)%N][(col+1)%N]== 0){
row = (row+1)%N;
col = (col+1)%N;
}else{
row = (row-1+N)%N;
}
magic[row][col] = i;
}
}
public void doublyEven(int[][] magicsqr){
int N = magicsqr.length;
int miniSqrNum = N/4; //size of boxes
int cnt = 1; //counter 1 to N*N
int invCnt = N*N; //counter N*N to 1
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(j>=miniSqrNum && j<N-miniSqrNum){
if(i>=miniSqrNum && i<N-miniSqrNum)
magicsqr[i][j] = cnt; //central box
else
magicsqr[i][j] = invCnt; // up & down boxes
}
else if(i<miniSqrNum || i>=N-miniSqrNum){
magicsqr[i][j]=cnt; // 4 corners
}
else
magicsqr[i][j] = invCnt; // left & right boxes
cnt++;
invCnt--;
}
}
}
public void singlyEven(int[][] magicsqr){
int N = magicsqr.length;
int halfN = N/2; //size of ABCD boxes
int k = (N-2)/4; // to get 'noses' of A & D boxes
int temp;
int [] swapCol = new int[N]; // columns which need to swap between C-B & A-D
int index=0; // index of swapCol
int [][] miniMagic = new int [halfN][halfN];
odd(miniMagic); //creating odd magic square for A box
//creating 4 magic boxes
for (int i=0; i<halfN; i++)
for (int j=0; j<halfN; j++){
magicsqr[i][j] = miniMagic[i][j]; //A box
magicsqr[i+halfN][j+halfN] = miniMagic[i][j]+halfN*halfN; //B box
magicsqr[i][j+halfN] = miniMagic[i][j]+2*halfN*halfN; //C box
magicsqr[i+halfN][j] = miniMagic[i][j]+3*halfN*halfN; //D box
}
for (int i=1; i<=k; i++)
swapCol[index++] = i;
for (int i=N-k+2; i<=N; i++)
swapCol[index++] = i;
//swaping values between C-B & A-D by known columns
for (int i=1; i<=halfN; i++)
for (int j=1; j<=index; j++){
temp=magicsqr[i-1][swapCol[j-1]-1];
magicsqr[i-1][swapCol[j-1]-1]=magicsqr[i+halfN-1][swapCol[j-1]-1];
magicsqr[i+halfN-1][swapCol[j-1]-1]=temp;
}
//swaping noses
temp=magicsqr[k][0];
magicsqr[k][0]=magicsqr[k+halfN][0];
magicsqr[k+halfN][0]=temp;
temp=magicsqr[k+halfN][k];
magicsqr[k+halfN][k]=magicsqr[k][k];
magicsqr[k][k]=temp;
//end of swaping
}
public void showMagicSqr(int[][] magicsqr){
int N = magicsqr.length;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
System.out.print(magicsqr [i][j] + " ");
System.out.println();
}
}
public boolean isMagicSqr(int[][] magicsqr){
int N = magicsqr.length;
int magicConst = (N*N*N+N)/2;
int rowsum = 0;
int colsum = 0;
int diag1 = 0;
int diag2 = 0;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
rowsum += magicsqr[i][j];
colsum += magicsqr[j][i];
}
diag1 += magicsqr[i][i];
diag2 += magicsqr[i][N-i-1];
if(rowsum!=magicConst){ return false; }
if(colsum!=magicConst){ return false; }
rowsum=0; colsum=0;
}
if(diag1!= magicConst || diag2 != magicConst)
return false;
System.out.println("Row sum = Coulmn Sum = Diagonal Sum = "+magicConst);
return true;
}
public static void main(String[] args) {
//int N = Integer.parseInt(args[0]);
Scanner reader = new Scanner(System.in);
System.out.println("Please enter the size of graph matrix");
int N = reader.nextInt();
int[][] matrix = new int[N][N];
MagicSquare ms = new MagicSquare();
if(N<=2) throw new RuntimeException("Matrix size must be greater than 2");
if (N % 2==1)
System.out.println("Please enter an even number ");
else if(N%4 ==0)
ms.doublyEven(matrix);
else
ms.singlyEven(matrix);
ms.showMagicSqr(matrix);
if(ms.isMagicSqr(matrix))
System.out.println("Generated Square is a magic square");
else
System.out.println("Generated Square is not a magic square");
}
}