數獨c 解決 dfs 減枝

2021-10-03 02:36:53 字數 1260 閱讀 7825

刷華為的機試題(傳送門:數獨),刷到了乙個關於數獨的題目,以為數獨還有什麼特殊的解,自己寫了個減枝的dfs過了83%的資料,但是好多同學都有同樣的問題,估計使題目的問題把,這題有多解但是做法不同,就有不同的答案,但是答案都是正確的,然後test有只有乙個這就很惱火,所以就假裝我這是正確的吧。

以前聽說過數獨但是一直沒有深入學習過,今天藉著刷題學習了一下關於數獨的知識,想不到什麼高效的解法,就寫了個dfs+減枝,居然能丟擲結果出來,難以置信具體思路看**吧,感覺跑起來挺快的:

#include#include#define ll long long

#define qq printf("qaq\n");

#define setit set::iterator

using namespace std;

const int maxn=1e5+5;

const int mod=1e9+7;

const int inf=0x3f3f3f3f;

int mp[10][10];

bool visrow[10][10],viscol[10][10],vispla[10][10],flag;

/* visrow 行標記 i行1-9那些數已經出現過了

viscol 列標記 vislpa宮標記

*/void dfs(int pos)//pos表示當前位置

int x=pos/9+1,y=pos%9+1;//根據pos計算行類座標

int pla=((x-1)/3)*3+(y-1)/3+1;//計算宮編號

if(mp[x][y])dfs(pos+1);

else

}}int main()

flag=0;

clock_t t1,t2;

t1=clock();

dfs(0);

t2=clock();

printf("time spent:%d\n",t2-t1);

return 0;}/*

世界最難數獨 跑的超級快

8 0 0 0 0 0 0 0 0

0 0 3 6 0 0 0 0 0

0 7 0 0 9 0 2 0 0

0 5 0 0 0 7 0 0 0

0 0 0 0 4 5 7 0 0

0 0 0 1 0 0 0 3 0

0 0 1 0 0 0 0 6 8

0 0 8 5 0 0 0 1 0

0 9 0 0 0 0 4 0 0

*/

POJ1011題解 dfs 減枝

題意 n根不同長度的小棍,拼成若干長棍,要這些長棍的長度相等,並且小棍剛好用完,問拼成長棍的最短長度是?思路 首先考慮搜尋的方向,最短,那肯定是從最短的情況開始遞增,最短的可能情況那肯定就是最長的的單個棍子,所以首先把這些小棍排序,從大到小,並計算這些棍子總和,拼成的長棍的長度從最長的小棍開始搜尋,...

數獨 dfs 剪枝

參考 yxc 題意 就是給你乙個九宮格,讓你填數,使橫行包含1 9,縱行包含1 9,每一塊包含1 9 思路 本題採用深搜,然後通過用col和row分別記錄橫行和縱行沒有被用過的數,cell來標記沒有被用過的數,通過0代表這個數已經被用過了,1代表這個數沒有被用過,然後通過剪枝找到某個數可以填數的最小...

9 9數獨(dfs暴力)

暴力,僅僅也是暴力而已 include using namespace std 構造完成標誌 bool sign false 建立數獨矩陣 int num 9 9 函式宣告 void input void output bool check int n,int key int dfs int n 主...