Ik probeer via java onderstaand magisch vierkant op te lossen:
Het oplossen moet gebeuren door getallen in te voeren uit de volgende getallenreeks:
3,6,9,12,18,21,24,27,30,33,36,42,45,48,54,57,60,66,72,74
De bedoeling van het vierkant is dat er op elke manier 195 uit komt, als je het horizontaal, verticaal, diagonaal of gebroken diagonaal optelt.
ik heb getracht dit in java op te lossen:
Nu is dit volgens mij een veel te omslachtige manier, en moet het veel beter kunnen.
Ik pak nu random een getal uit de reeks, en stop die ergens in het vierkant. Als het vierkant vol zit check ik of het het gezochte vierkant is, zoniet, dan wordt het nog een keer opnieuw gedaan.
Deze manier kost heel veel tijd, en het is niet zeker of ooit wel het gezochte vierkant er uit komt.
Ook kan het voorkomen dat een vierkant meerdere keren langs komt, wat ook niet echt wensbaar is.
Weet iemand of er een betere manier is om dit te doen? of bestaat er een algoritme voor?
| x | 51 | x | x | x |
| x | x | x | x | x |
| x | x | x | 63 | x |
| x | x | x | x | 39 |
| 15 | x | 69 | x | x |
Het oplossen moet gebeuren door getallen in te voeren uit de volgende getallenreeks:
3,6,9,12,18,21,24,27,30,33,36,42,45,48,54,57,60,66,72,74
De bedoeling van het vierkant is dat er op elke manier 195 uit komt, als je het horizontaal, verticaal, diagonaal of gebroken diagonaal optelt.
ik heb getracht dit in java op te lossen:
code:
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
| public class Magic {
public static void main(String[] args) {
int hor1 = 0;
int hor2 = 0;
int hor3 = 0;
int hor4 = 0;
int hor5 = 0;
int ver1 = 0;
int ver2 = 0;
int ver3 = 0;
int ver4 = 0;
int ver5 = 0;
int dia1 = 0;
int dia2 = 0;
int gebdia1 = 0;
int gebdia2 = 0;
int gebdia3 = 0;
int gebdia4 = 0;
int gebdia5 = 0;
int gebdia6 = 0;
int gebdia7 = 0;
int gebdia8 = 0;
int x = 0;
int[][] magic = null;
while((hor1 != 195) || (hor2 !=195) || (hor3 !=195) || (hor4 !=195) || (hor5 !=195)
|| (ver1 != 195) || (ver2 !=195) || (ver3 !=195) || (ver4 !=195) || (ver5 !=195)
|| (dia1 != 195) || (dia2 !=195)
|| (gebdia1 !=195) || (gebdia2 !=195) || (gebdia3 !=195) || (gebdia4 !=195)
|| (gebdia5 !=195) || (gebdia6 !=195) || (gebdia7 !=195) || (gebdia8 !=195)){
x++;
int[] getallen = {3,6,9,12,18,21,24,27,30,33,36,42,45,48,54,57,60,66,72,74};
magic = new int[5][5];
magic[0][1] = 51;
magic[2][3] = 63;
magic[3][4] = 39;
magic[4][0] = 15;
magic[4][2] = 69;
for (int ver = 0;ver <5;ver++){
for(int hor = 0;hor<5;hor++){
if (magic[ver][hor] == 0){
int rand = (int)(20 * Math.random());
while (getallen[rand] == 0)
rand = (int)(20 * Math.random());
if (getallen[rand] != 0){
magic[ver][hor] = getallen[rand];
getallen[rand] = 0;}
}}}
if ((x % 100000) == 0)
System.out.print(".");
if ((x % 1000000) == 0)
System.out.print(x/1000000);
hor1 = magic[0][0] + magic[0][1] +magic[0][2] +magic[0][3] +magic[0][4];
hor2 = magic[1][0] + magic[1][1] +magic[1][2] +magic[1][3] +magic[1][4];
hor3 = magic[2][0] + magic[2][1] +magic[2][2] +magic[2][3] +magic[2][4];
hor4 = magic[3][0] + magic[3][1] +magic[3][2] +magic[3][3] +magic[3][4];
hor5 = magic[4][0] + magic[4][1] +magic[4][2] +magic[4][3] +magic[4][4];
ver1 = magic[0][0] + magic[1][0] +magic[2][0] +magic[3][0] +magic[4][0];
ver2 = magic[0][1] + magic[1][1] +magic[2][1] +magic[3][1] +magic[4][1];
ver3 = magic[0][2] + magic[1][2] +magic[2][2] +magic[3][2] +magic[4][2];
ver4 = magic[0][3] + magic[1][3] +magic[2][3] +magic[3][3] +magic[4][3];
ver5 = magic[0][4] + magic[1][4] +magic[2][4] +magic[3][4] +magic[4][4];
dia1 = magic[0][0] + magic[1][1] +magic[2][2] +magic[3][3] +magic[4][4];
dia2 = magic[0][4] + magic[1][3] +magic[2][2] +magic[3][1] +magic[4][0];
gebdia1 = magic[0][1] + magic[1][2] +magic[2][3] +magic[3][4] +magic[0][4];
gebdia2 = magic[0][2] + magic[1][3] +magic[2][4] +magic[3][0] +magic[4][1];
gebdia3 = magic[0][3] + magic[1][4] +magic[0][2] +magic[1][3] +magic[1][4];
gebdia4 = magic[0][4] + magic[1][0] +magic[2][1] +magic[3][2] +magic[4][3];
gebdia5 = magic[0][0] + magic[1][4] +magic[2][3] +magic[3][2] +magic[4][1];
gebdia6 = magic[0][1] + magic[1][0] +magic[2][4] +magic[3][3] +magic[4][2];
gebdia7 = magic[0][2] + magic[1][1] +magic[2][0] +magic[3][4] +magic[4][3];
gebdia8 = magic[0][3] + magic[1][2] +magic[2][1] +magic[3][0] +magic[4][4];
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (magic[i][j] < 10) System.out.print(" "); // for alignment
if (magic[i][j] < 100) System.out.print(" "); // for alignment
System.out.print(magic[i][j] + " "); }
System.out.println();}
System.out.println("\nhor1: " + hor1);
System.out.println("hor2: " + hor2);
System.out.println("hor3: " + hor3);
System.out.println("hor4: " + hor4);
System.out.println("hor5: "+ hor5);
System.out.println("ver1: " +ver1);
System.out.println("ver2: "+ ver2 );
System.out.println("ver3: " +ver3);
System.out.println("ver4: " + ver4);
System.out.println("ver5: " + ver5);
}
} |
Nu is dit volgens mij een veel te omslachtige manier, en moet het veel beter kunnen.
Ik pak nu random een getal uit de reeks, en stop die ergens in het vierkant. Als het vierkant vol zit check ik of het het gezochte vierkant is, zoniet, dan wordt het nog een keer opnieuw gedaan.
Deze manier kost heel veel tijd, en het is niet zeker of ooit wel het gezochte vierkant er uit komt.
Ook kan het voorkomen dat een vierkant meerdere keren langs komt, wat ook niet echt wensbaar is.
Weet iemand of er een betere manier is om dit te doen? of bestaat er een algoritme voor?