这篇文章距离最后更新已过1281天,如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
地址
https://leetcode.com/problems/sudoku-solver/description/
题目
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.
思路
第一眼暴力,然后觉得不可能这么sb,还以为要用dancing-link,后来觉得做个leetcode怎么可能会需要用到这种东西。百度一发题解,果然如此,就是sb暴力
代码
class Solution {
public:
int ff=0,ur[10][10],ul[10][10],uu[10][10];
vector<vector<char>> mp,ans;
void init(void)
{
for(int i=0;i<9;i++)
{
for(int j=1;j<=9;j++)
ur[i][j]=ul[i][j]=uu[i][j]=1;
for(int j=0;j<9;j++)
{
if(mp[i][j]!='.')
ur[i][mp[i][j]-'0']=0;
if(mp[j][i]!='.')
ul[i][mp[j][i]-'0']=0;
}
}
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
if(mp[i][j]!='.')
uu[i/3*3+j/3][mp[i][j]-'0']=0;
}
void dfs(int x,int y)
{
if(ff) return;
if(x==9)
{
ff=1,ans=mp;
return;
}
if(mp[x][y]!='.')
{
dfs(x+(y==8),(y+1)%9);
return ;
}
for(int i=1;i<10;i++)
if(ur[x][i]&&ul[y][i]&&uu[x/3*3+y/3][i])
{
ur[x][i]=ul[y][i]=uu[x/3*3+y/3][i]=0;
mp[x][y]='0'+i;
dfs(x+(y==8),(y+1)%9);
mp[x][y]='.';
ur[x][i]=ul[y][i]=uu[x/3*3+y/3][i]=1;
}
}
void solveSudoku(vector<vector<char>>& board) {
mp=board;
init();
dfs(0,0);
board=ans;
}
};