回溯算法-解数独
回溯算法最佳實踐:解數獨
///數獨
1.3*3的判斷
2.很多if-------怎么回溯二維棋盤+有預設,不填
3.這個沒設初始值,要設就加個輸入給res
2021.3.9復習
重點在于怎么遍歷(換行)
第28-33行非常重要,不是硬置,而是開新遍歷
另外跳過已知條件,應放在遍歷可行解之前,并在if內遞歸
只找一個可行解的話:可以利用return true 找到可行解直接結束,具體看gitbook
中間有if判斷,阻斷繼續遍歷,很重要
#include <iostream> #include<bits/stdc++.h> using namespace std; typedef long long ll; #define maxn 1000005 int res[10][10]; int isvalid(int x,y,a) {} int neednum(int x,y) {} int fin=9;///重點在于怎么遍歷(換行)void traceback() {if(x>fin){//存儲或輸出return ;}if(y>fin){ // y=1; // x+=1; ///非常重要,不是硬置,而是開新遍歷traceback(x+1,1);}if(res[x][y]!=0)///有數了,跳過的應該放在遍歷之前{traceback(x,y+1);}for(int i=1;i<=fin;i++){//if(neednum(x,y)&&!isvalid(x,y,a))continue;//////這里寫的也有問題,那碰上不能填的,就直接完結了///跳過的應該放在遍歷之前if(!isvalid(x,y,a))continue;res[x][y]=i;traceback(x,y+1);///重點res[x][y]=0;}}///另外只找一個可行解,可以利用return true 找到可行解直接結束,具體看gitbook ///(中間有if判斷,阻斷繼續遍歷,很重要)int main() {return 0; }總結
- 上一篇: 回溯算法-排列/组合/子集
- 下一篇: 回溯算法-括号生成