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] = '.';
}
}
}
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] = '.';
}
}
}