Untitled

mail@pastecode.io avatar
unknown
java
2 years ago
4.0 kB
2
Indexable
Never
import java.util.Scanner;

public class Main {

    static int[][] board = {
            { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 0, 0, 0, 0 }
    };

    public static void main(String[] args) {
        System.out.println("Solving...");
        solve();
        System.out.println("No more solutions!");
    }

    static boolean possible(int y, int x, int n) {
        /* Når funksjonen possible blir kalt, så tar den 3 argumenter.
         * x og y -> som er posisjonen i brettet, og n som er tallet som forsøkes i utvalg posisjon.*/
        

        /*  Her iterater vi over raden for å se etter n i samme rad.
         * Vi returner false, hvis vi møter på n i samme rad. Da ruten ikke er gyldig.*/
        for (int i = 0; i < 9; i++) {
            if (board[y][i] == n) {
                return false;
            }
        }
        // Her gjør vi det samme, bare for kolonnen
        for (int i = 0; i < 9; i++) {
            if (board[i][x] == n) {
                return false;
            }
        }
        /* Her sjekker vi 3by3 boksen.
         * Vi har en nested for loop som sjekker 3by3, og vi bruker 
         * xBox og yBox for å skyve den 3 rader og kolonner om gangen. */
        int xBox = (x / 3) * 3;
        int yBox = (y / 3) * 3;

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (board[yBox + i][xBox + j] == n) {
                    return false;
                }
            }
        }
        // Når vi bunnen av metoden så returnerer vi true, fordi det betyr at vi ikke har funnet n
        // i rad, kolonne eller boks.
        return true;
    }

    static void solve() {
        for (int y = 0; y < 9; y++) {
            for (int x = 0; x < 9; x++) { // Når vi skal løse den, går vi fra topp til bunn.
                if (board[y][x] == 0) { // Vi finner en tom rute.
                    for (int n = 1; n < 10; n++) { // vi sjekker tall fra 1-9 for å ha i ruten.
                        if (possible(y, x, n)) { // Sjekker om tallet er gyldig ved å kalle på metoden.
                            board[y][x] = n; // Tallet er gyldig, og vi setter inn tallet.
                            solve(); // Vi kaller på metoden igjen (recursion), i callstacken
                            // har vi allerde fylt inn forrige tall.
                            board[y][x] = 0; // Siste i callstacken kommer hit når denne når vi møter på en blindvei. 
                            // Altså når en rute ikke tar noen tall fra 1-9.
                        }
                    }
                    return; // Recursion break -> Her møter vi på blindveien, etter vi har testet 1-9 i en rute. 
                }
            }
        }
        displayBoard(); // Vi må vise brettet her, fordi vi fortsatt har en call stack.
        // Når vi når bunnen av funksjonen vil vi gå tilbake til start og når vi
        // fullfører callstacken, så brettet gå til original oppsett, da vi bare har gjort en recursion på
        // tomme ruter (n == 0).
    }

    static void displayBoard() {
        // Looper over brettet for å printe ut hver enkelt rute.
        for (int row = 0; row < board.length; row++) {
            for (int col = 0; col < board[row].length; col++) {
                System.out.printf("%2d", board[row][col]);
            }
            System.out.println();
        }
        System.out.println();
        System.out.println("Press enter for more: ");
        String nextLine = new Scanner(System.in).nextLine();
    }
}