LeetCode 37. 解數獨
題目描述
解題思路
暴力遞迴
使用dfs進行暴力遞迴,需要判斷一下三個條件,標記一下是否出現過,行、列以及3*3的小格子中是否出現過。
注意遞迴結束的條件,失敗後不要返回(在這裡寫錯了,沒注意到)。
程式碼實現
int r[12][12];
int c[12][12];
int g[12][12];
int mp[12][12];
class Solution
{
public:
int Change(int x)
{
if(x <= 3) return 1;
if(x <= 6) return 2;
return 3;
}
int dfs(int x, int y)
{
if(x == 10)
return 1;
int flag = 0;
if(mp[x][y] != 0)
{
if(y == 9)
flag = dfs(x+1, 1);
else
flag = dfs(x, y+1);
return flag;
}
else
{
int sx = Change(x);
int sy = Change(y);
if(sx == 2) sy += 3;
if(sx == 3) sy += 6;
flag = 0;
for(int i = 1; i <= 9; i++)
{
if(!r[x][i] && !c[y][i] && !g[sy][i])
{
mp[x][y] = i;
r[x][i] = 1;
c[y][i] = 1;
g[sy][i] = 1;
if(y == 9) flag = dfs(x+1, 1);
else flag = dfs(x, y+1);
if(!flag)
{
mp[x][y] = 0;
r[x][i] = 0;
c[y][i] = 0;
g[sy][i] = 0;
}
else
return flag;
}
}
}
return 0;
}
void solveSudoku(vector<vector<char>>& board)
{
memset(r, 0, sizeof(r));
memset(c, 0, sizeof(c));
memset(g, 0, sizeof(g));
for(int i = 0; i < 9; ++i)
{
for(int j = 0; j < 9; ++j)
{
if(board[i][j] == '.')
mp[i+1][j+1] = 0;
else
mp[i+1][j+1] = board[i][j]-'0';
if(mp[i+1][j+1] == 0) continue;
int num = mp[i+1][j+1];
r[i+1][num] = 1;
c[j+1][num] = 1;
int x = Change(i+1);
int y = Change(j+1);
if(x == 2) y += 3;
if(x == 3) y += 6;
g[y][num] = 1;
}
}
dfs(1,1);
for(int i = 1; i <= 9; ++i)
{
for(int j = 1; j <= 9; ++j)
board[i-1][j-1] = char(mp[i][j]+'0');
}
}
};
//測試樣例
530070000
600195000
098000060
800060003
400803001
700020006
060000280
000419005
000080079
相關文章
- leetcode37 解數獨問題 hardLeetCode
- leetcode:有效的數獨LeetCode
- LeetCode 36——有效的數獨LeetCode
- java解數獨Java
- [LeetCode] Sudoku Solver 求解數獨LeetCode
- [LeetCode] Valid Sudoku 驗證數獨LeetCode
- leetCode 36. Valid Sudoku(數獨) 雜湊LeetCode
- 一個解數獨的程式
- 程式碼隨想錄演算法訓練營第30天 | 332.重新安排行程 、51. N皇后、37. 解數獨演算法行程
- uniapp js 數獨小遊戲 寫死的簡單數獨 數獨 3.0APPJS遊戲
- vue 數獨Vue
- 數獨遊戲遊戲
- python解數獨的簡單優化Python優化
- [LeetCode]1207. 獨一無二的出現次數LeetCode
- 【原創】視訊+文字:詳解VBA解決數獨問題
- 37. 請求的生命週期
- leetcode之兩數相加解題思路LeetCode
- 羅塞塔網站上的c++解數獨程式網站C++
- 據說用概率去解數獨的c++程式C++
- 數獨遊戲技巧(轉)遊戲
- PostgreSQL生成任意基數數獨-2SQL
- PostgreSQL生成任意基數數獨-3SQL
- leetCode解題記錄1 - 兩數之和LeetCode
- LeetCode-343. 整數拆分 - 題解分析LeetCode
- Leetcode 的強大之處 Swift Code Review 演算法題 ( 有效的數獨 , 36 )LeetCodeSwiftView演算法
- 數獨遊戲九宮格遊戲
- Bootstrap系列 -- 37. 基礎導航樣式boot
- 一個利用DLX演算法的Python解數獨程式演算法Python
- Acwing166 數獨題解 - DFS剪枝最佳化
- 用pl/sql解決芬蘭數學家因卡拉設計的最難數獨SQL
- LeetCode題解(1512):好數對的數目(Python)LeetCodePython
- leetcode 解題 2.兩數相加-python3 題解LeetCodePython
- 個人專案實戰(數獨)
- 拉丁方的衍生遊戲“數獨”遊戲
- sudoku 數獨 XY-ChainsAI
- 洛谷P1784.數獨
- PL/SQL解數獨在簡單優化基礎上的改進SQL優化
- 日行一算(數獨遊戲)遊戲