On se retrouve aujourd'hui pour la solution du précédent #KataOfTheWeek proposé par Josquin en début de semaine !
La solution que je propose consiste à prendre le nombre le plus bas, et à le descendre. Dans le cas de la première colonne, c'est assez simple, le 2 "tombe" en bas.
Ensuite, si un nombre tombe sur un autre nombre, il faut les faire s'additionner. C'est pourquoi dans la deuxième colonne, on additionne les deux 2 pour en faire un 4. C'est aussi pourquoi je commence par le nombre le plus bas : sinon, ce seront les mauvais 2 qui s'additionneront et le résultat en serait différent.
La colonne 3 possède une difficulté supplémentaire : les nombres vont s'additionner en tombant mais ne doivent pas continuer à s'additionner avec le 8 tout en haut. Pour cela, la solution que j'ai choisit est de créer un tableau supplémentaire qui retient quels nombres ont été additionnés de façon à ne pas les additionner de nouveau.
La colonne 4 quant à elle reprend toutes les difficultés des autres colonnes et est un bon test pour voir si l'algorithme fonctionne bien.
Exemple :
| | | 8 | 2 |
| | 2 | | 2 |
| 2 | 2 | 4 | 2 |
| | 2 | 4 | 2 |
|
V
| | | | |
| | | | |
| | 2 | 8 | 4 |
| 2 | 4 | 8 | 4 |
public static void moveDownward(int [][] board) {
boolean [][] hasAlreadyBeenAdded = new boolean[4][4];
for (int column = 0; column < board[0].length; column++) {
for (int row = board.length - 1; row >= 1; row--) {
if ((board[row][column] == board[row - 1][column]) && board[row][column] != 0 && hasAlreadyBeenAdded[row][column] != true && hasAlreadyBeenAdded[row - 1][column] != true) {
// Sum 2 adjacent numbers
board[row][column] = board[row][column] + board[row - 1][column];
board[row - 1][column] = 0;
hasAlreadyBeenAdded[row][column] = true;
row = board.length - 1;
}
if (board[row][column] == 0 && board[row - 1][column] != 0) {
// Drop the number down
board[row][column] = board[row - 1][column];
board[row - 1][column] = 0;
hasAlreadyBeenAdded[row][column] = hasAlreadyBeenAdded[row - 1][column];
row = board.length;
}
}
}
}
A bientôt pour un nouveau #KataOfTheWeek !