

{"id":1111,"date":"2020-11-23T17:58:33","date_gmt":"2020-11-23T16:58:33","guid":{"rendered":"https:\/\/dornisoft.es\/dorniblog\/?p=1111"},"modified":"2023-03-24T18:26:02","modified_gmt":"2023-03-24T17:26:02","slug":"resolver-sudokus-con-java-y-recursividad","status":"publish","type":"post","link":"https:\/\/dornisoft.es\/dorniblog\/resolver-sudokus-con-java-y-recursividad\/","title":{"rendered":"Resolver sudokus con Java y recursividad"},"content":{"rendered":"\n<p>Hoy traemos el c\u00f3digo necesario para resolver sudokus en Java utilizando recursividad.<br>Tendremos dos clases una Principal.java con el main y otra clase sudoku.java.<br>La clase sudoku.java contendr\u00e1 la funcion resolverSudoku() que utilizar\u00e1 recursividad. Y las funciones necesarias para comprobar que el numero introducido en la celda es correcto(esValido()):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package sudoku;\n\n\/**\n *\n * @author Javi\n *\/\npublic class Sudoku {\n    \n    \n    private int tablero[][];\n    static final int  SIN_ASIGNAR=0;\n    \n    public Sudoku(int sudoku[][]){\n        this.tablero=sudoku;\n    }\n    \n    \n    public boolean resolverSudoku(){\n        \n        for(int fila=0;fila &lt;9;fila++){\n            for (int columna=0;columna&lt;9;columna++){\n                if(tablero[fila][columna]==SIN_ASIGNAR){\n                    for (int numero =1;numero&lt;=9;numero++){\n                        if(esValido(fila,columna,numero)){\n                            tablero[fila][columna]=numero;\n                            if(resolverSudoku()){\n                                return true;\n                            }else{\n                                tablero[fila][columna]=SIN_ASIGNAR;\n                            }\n                        }\n                    }\n                    return false;\n                }\n            }\n        }\n        return true;\n    }\n    \n    private boolean esValido (int fila, int columna, int numero){\n        return !(contieneFila(fila,numero)||contieneColumna(columna,numero)||contieneCaja(fila,columna,numero));\n    }\n    \n    private boolean contieneFila(int fila,int numero){\n        for(int columna=0;columna&lt;9;columna++){\n            if(tablero[fila][columna]==numero){\n                return true;\n            }\n        }\n        return false;\n    }\n    \n    private boolean contieneColumna(int columna,int numero){\n        for(int fila=0;fila&lt;9;fila++){\n            if(tablero[fila][columna]==numero){\n                return true;\n            }\n        }\n        return false;\n    }\n    \n    private boolean contieneCaja(int fila, int columna,int numero){\n        int f = fila - fila % 3;\n        int c = columna -columna % 3;\n        for(int i =f;i&lt;f+3;i++){\n            for(int j = c; j&lt;c+3;j++){\n                if(tablero[i][j]==numero){\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n    \npublic void ImprimirSudoku(){\n    for(int i=0;i&lt;9;i++){\n        for (int j=0;j&lt;9;j++){\n            System.out.print(tablero[i][j]);\n        }\n        System.out.println(\"\");\n    }\n}    \n\n    \n}<\/pre>\n\n\n\n<p>Con esta clase conseguimos que nos devuelva un sudoku solucionado.<br>Con la clase principal.java creamos el objeto miSudoku y le pasamos el tablero que queremos que resuelva.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">package sudoku;\n\n\/**\n *\n * @author Javi\n *\/\npublic class Principal {\n\n    \/**\n     * @param args the command line arguments\n     *\/\n    public static void main(String[] args) {\n        \/\/ TODO code application logic here\n        \n        int tablero[][]={{6,9,5,3,7,1,8,4,2},\n                         {0,0,0,0,0,0,0,0,0},\n                         {8,4,1,2,9,6,3,7,5},\n                         {0,0,0,0,0,0,0,0,6},\n                         {0,0,0,0,0,0,0,0,8},\n                         {5,6,2,0,1,7,4,3,9},\n                         {0,0,0,0,0,0,1,8,7},\n                         {0,0,0,0,0,0,0,0,0},\n                         {7,5,4,0,0,0,0,0,0}};\n        \n        Sudoku miSudoku=new Sudoku(tablero);\n        miSudoku.resolverSudoku();\n        miSudoku.ImprimirSudoku();\n                \n        }\n        \n    }<\/pre>\n\n\n\n<p>En este video aprend\u00ed como era el algoritmo.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.youtube.com\/embed\/ATOb2jEvo24\">video youtube<\/a><\/p>\n\n\n\n<p>He hecho una versi\u00f3n del c\u00f3digo anterior en PHP pero el algoritmo es el mismo, lo podeis probar <a href=\"https:\/\/dornisoft.es\/sudoku\" data-type=\"URL\" data-id=\"https:\/\/dornisoft.es\/sudoku\">https:\/\/dornisoft.es\/sudoku<\/a><br><br>Espero que te guste \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoy traemos el c\u00f3digo necesario para resolver sudokus en Java utilizando recursividad.Tendremos dos clases una Principal.java con el main y otra clase sudoku.java.La clase sudoku.java contendr\u00e1 la funcion resolverSudoku() que utilizar\u00e1 recursividad. Y las funciones necesarias para comprobar que el numero introducido en la celda es correcto(esValido()): Con esta clase conseguimos que nos devuelva un &hellip; <a href=\"https:\/\/dornisoft.es\/dorniblog\/resolver-sudokus-con-java-y-recursividad\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \u00abResolver sudokus con Java y recursividad\u00bb<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[29],"tags":[],"class_list":["post-1111","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/dornisoft.es\/dorniblog\/wp-json\/wp\/v2\/posts\/1111","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dornisoft.es\/dorniblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dornisoft.es\/dorniblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dornisoft.es\/dorniblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dornisoft.es\/dorniblog\/wp-json\/wp\/v2\/comments?post=1111"}],"version-history":[{"count":6,"href":"https:\/\/dornisoft.es\/dorniblog\/wp-json\/wp\/v2\/posts\/1111\/revisions"}],"predecessor-version":[{"id":2442,"href":"https:\/\/dornisoft.es\/dorniblog\/wp-json\/wp\/v2\/posts\/1111\/revisions\/2442"}],"wp:attachment":[{"href":"https:\/\/dornisoft.es\/dorniblog\/wp-json\/wp\/v2\/media?parent=1111"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dornisoft.es\/dorniblog\/wp-json\/wp\/v2\/categories?post=1111"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dornisoft.es\/dorniblog\/wp-json\/wp\/v2\/tags?post=1111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}