Sudoku Solver

Problem:

Write a program to solve a Sudoku puzzle by filling the empty cells.

Empty cells are indicated by the character '.'.

You may assume that there will be only one unique solution.

A sudoku puzzle...


...and its solution numbers marked in red.

经典题了,广搜。
Solution:
public class Solution {
    char[][] gboard;
    boolean isSolved;
    public void solveSudoku(char[][] board) {
     gboard = board;
     int i=0,j=0;
     outer:
     for(;i<9;i++)
          for(j=0;j<9;j++)
            if(gboard[i][j]=='.')
                 break outer;
     solver(i, j);
    }

    private void solver(int i,int j)
    {
         boolean[] unavailable = new boolean[9];
        for(int k=0;k<9;k++)
             if(gboard[k][j]!='.')
                 unavailable[gboard[k][j]-'1'] = true;
         for(int k=0;k<9;k++)
            if(gboard[i][k]!='.')
                unavailable[gboard[i][k]-'1'] = true;
         for(int x=3*(i/3);x<3*(i/3)+3;x++)
            for(int y=3*(j/3);y<3*(j/3)+3;y++)
                if(gboard[x][y]!='.')
                     unavailable[gboard[x][y]-'1'] = true;
         for(int k=0;k<9;k++)
             if(!unavailable[k])
            {
                gboard[i][j] = Integer.toString(k+1).charAt(0);
                int m=i,n=j+1;
                outer:
                for(;m<9;m++)
                {
                     if(m>i)
                        n = 0;
                     for(;n<9;n++)
                        if(gboard[m][n]=='.')
                            break outer;
                 }
                if(m==9)
                {
                     isSolved = true;
                     return;
                 }
                  solver(m, n);
                  if(isSolved)   //已经找到解,返回,不然结果会被清除
                    return;
                  gboard[i][j] = '.';
             }
        }
}
​​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值