刷華為的機試題(傳送門:數獨),刷到了乙個關於數獨的題目,以為數獨還有什麼特殊的解,自己寫了個減枝的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 主...