回溯算法-解数独
回溯算法最佳實(shí)踐:解數(shù)獨(dú)
///數(shù)獨(dú)
1.3*3的判斷
2.很多if-------怎么回溯二維棋盤(pán)+有預(yù)設(shè),不填
3.這個(gè)沒(méi)設(shè)初始值,要設(shè)就加個(gè)輸入給res
2021.3.9復(fù)習(xí)
重點(diǎn)在于怎么遍歷(換行)
第28-33行非常重要,不是硬置,而是開(kāi)新遍歷
另外跳過(guò)已知條件,應(yīng)放在遍歷可行解之前,并在if內(nèi)遞歸
只找一個(gè)可行解的話(huà):可以利用return true 找到可行解直接結(jié)束,具體看gitbook
中間有if判斷,阻斷繼續(xù)遍歷,很重要
#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;///重點(diǎn)在于怎么遍歷(換行)void traceback() {if(x>fin){//存儲(chǔ)或輸出return ;}if(y>fin){ // y=1; // x+=1; ///非常重要,不是硬置,而是開(kāi)新遍歷traceback(x+1,1);}if(res[x][y]!=0)///有數(shù)了,跳過(guò)的應(yīng)該放在遍歷之前{traceback(x,y+1);}for(int i=1;i<=fin;i++){//if(neednum(x,y)&&!isvalid(x,y,a))continue;//////這里寫(xiě)的也有問(wèn)題,那碰上不能填的,就直接完結(jié)了///跳過(guò)的應(yīng)該放在遍歷之前if(!isvalid(x,y,a))continue;res[x][y]=i;traceback(x,y+1);///重點(diǎn)res[x][y]=0;}}///另外只找一個(gè)可行解,可以利用return true 找到可行解直接結(jié)束,具體看gitbook ///(中間有if判斷,阻斷繼續(xù)遍歷,很重要)int main() {return 0; }總結(jié)
- 上一篇: 回溯算法-排列/组合/子集
- 下一篇: 回溯算法-括号生成