搜尋依舊寫的稀爛。。
大概就是數獨吧。。橫、數、小九宮格內不重複。
這種題主要的手法還是搜尋、暴力列舉。這道題主要的難點是以什麼為單位開始搜(其實也不難)以及怎麼設定vis剪枝。
在這裡,我選擇了以搜尋二叉樹構建的map來記錄vis(畢竟map查詢起來較容易)。將9個小九宮格、每行、每列各構建乙個map來記錄,所以需要map陣列。然後,按照從左到右,從上到下的順序,以格仔為單位開始搜尋。每次遍歷1到9,檢查是否符合條件,遇到不行就回溯。大概就是這樣了。。
#include
#include
#include
#include
#include
using
namespace std;
char floor[10]
[10]=
;char floor_b[10]
[10]=
;map<
char
,int
> hang[10]
;map<
char
,int
> lie[10]
;map<
char
,int
> ge[10]
;int flag=0;
inline
intcnt_ge
(int x,
int y)
//座標->格仔
else
if(x<6)
else
if(x<9)
}inline
bool
judge
(int x,
int y,
int i)
void
dfs(
int x,
int y)
else
printf
("%c"
,floor[i]
[j]);}
printf
("\n");
}}else
if(flag==
0&&floor[x]
[y]!=
'0')
else}}
}int
main()
memset
(floor,
'0',
sizeof
(floor));
memset
(floor_b,
'0',
sizeof
(floor_b));
for(
int i=
0;i<
9;i++)}
}// clock_t starttime=clock();
dfs(0,
0);// clock_t endtime=clock();
// cout<<"用時:"<<(double)(endtime-starttime)/clocks_per_sec<<"s"<}
return0;
}
poj2676 Sudoku 數獨,dfs 剪枝)
給定乙個不完整9 9數獨,未填部分用0表示,恢復數獨,並列印 在讀入的時候,我們開幾個陣列,sudoku 9 9 相當於這張數獨地圖,上面記錄值 checkrow 9 10 第i行,是否出現過數v,1 v 9 checkcol 9 10 第j列,是否出現過數v,1 v 9 square 9 10 第...
POJ2676 Sudoku 詳解優化
思路是很簡單的,類似於八皇后問題 暴力搜 用h i j 標記第i行中是否存在j 同理,l i j 標識第i列中是否存在j k i j 第i個方塊中是否存在j 難的是如何進行剪枝,可行的乙個方法是記錄每個初始為0的點的座標與可能放置的數字的個數,從少往多遍歷,這樣能有效的減小搜尋樹的規模。剪枝優化待更...
poj 2676 數獨問題 dfs
題意 完成數獨程式,數獨要求每行每列且每個3 3矩陣都必須是1 9的數字組成。思路 dfs 用row i n 記錄第i行n存在 用col j n 記錄第j列n存在 grid k n 記錄第k個3 3中的n存在 遍歷的時候,先把列遍歷完然後在遍歷行 if map r c 現在推第乙個矩陣為 0,0 0...