Sudoku dfs (java)

Sudoku:
como se muestra en la figura a continuación, los jugadores deben inferir los números de todos los espacios restantes en función de los números conocidos en la placa de 9 × 9, y asegurarse de que cada fila, columna y número del mismo color en los nueve palacios contenga 1-9, No repetir Las respuestas de Sudoku son todas únicas, por lo que las soluciones múltiples también se llaman sin soluciones. Se dice que las cifras en esta imagen son los temas más difíciles ideados por los matemáticos finlandeses en tres meses. Pero para ustedes que pueden usar la programación de computadoras, me temo que es fácil. El requisito de esta pregunta es ingresar la pregunta de Sudoku, y el programa genera la única solución de Sudoku. Garantizamos que todos los formatos de datos conocidos son legales y que el problema tiene una solución única. El requisito de formato es ingresar 9 líneas con 9 dígitos en cada línea, 0 significa desconocido y se conocen otros dígitos. Se generan 9 líneas y 9 números en cada línea indican la solución de Sudoku.
Inserte la descripción de la imagen aquí
Use dfs para resolver tales problemas, vea los comentarios del código específicamente, de la siguiente manera:

import java.util.Scanner;
public class Sd {
    //数独游戏(深搜法)
    public void dfs(char [][]a,int b,int c)
    {
        if (b==9)//出口
        {
            for (int i=0;i<=8;i++)//打印输出
                System.out.println(a[i]);
            System.exit(0);//退出程序
        }
        if (a[b][c]=='0')
        {
            for (int i=1;i<=9;i++)
            {
                if (check(a,b,c,i))
                {
                    char []temp=String.valueOf(i).toCharArray();
                    a[b][c]=temp[0];//(char)('0'+k)//给当前状态赋值
                    dfs(a,b+(c+1)/9,(c+1)%9);//状态转移
                }
            }
            a[b][c]='0';//回溯
        }
        else
        {
            dfs(a,b+(c+1)/9,(c+1)%9);//状态转移
        }
    }
    public boolean check(char [][]a,int x,int y,int c)//检查在这个点放值是否合适
    {
        for (int i=0;i<=8;i++)//检验每一行每一列
        {
            if (a[x][i]==(char)('0'+c)||a[i][y]==(char)('0'+c))
                return false;
        }
        for (int i=(x/3)*3;i<=(x/3+1)*3;i++)//检验每一个小九宫格
            for (int j=(y/3)*3;j<=(y/3+1)*3;j++)
            {
                if (a[x][y]==(char)('0'+c))
                    return false;
            }
            return true;
    }
    public static void main(String[] args) {
        Scanner a=new Scanner(System.in);
        char [][]b=new char[9][9];
        for (int i=0;i<9;i++)//字符数组的输入
            b[i]=a.nextLine().toCharArray();
        Sd c=new Sd();
        c.dfs(b,0,0);
    }
}

Los resultados son los siguientes:
Inserte la descripción de la imagen aquí

14 artículos originales publicados · Me gusta0 · Visitas 232

Supongo que te gusta

Origin blog.csdn.net/lianggege88/article/details/105604099
Recomendado
Clasificación