POJ 2676 Sudoku 數獨 解題報告

2021-10-02 06:36:50 字數 1519 閱讀 1631

搜尋依舊寫的稀爛。。

大概就是數獨吧。。橫、數、小九宮格內不重複。

這種題主要的手法還是搜尋、暴力列舉。這道題主要的難點是以什麼為單位開始搜(其實也不難)以及怎麼設定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...