巧妙的用 n 表示 第n/9行第n%9列 (0是第乙個數)。
巧妙的用 row = (n/9)/33; col = n%9/33; 表示數獨裡面的小正方形(行、列)。那麼遍歷數獨就至於要乙個 n即可。 (0<=n < 81)
因為數獨答案唯一,所以只要找到乙個正確的,就可以 exit(0); 了。
#include
#include
//exit(0) 強制退出。(數獨只有唯一解)
using
namespace std;
int a[9]
[9];
//n為第n/9行第n%9列 //巧妙的用 n 表示了 行&列中所有位置
bool
judge
(int n,
int i)
//判斷 第n/9行第n%9列 數字 i 是否合法
int row =
(n/9)/
3*3;
//檢查小正方形 (這個方法好巧妙!利用n控制了小正方形) 40 4行4列 (3,3)--(5,5)
int col = n%9/
3*3;
for(
int b=row;b<=row+
2;b++)}
}return
true;}
void
dfs(
int n)
cout<}exit(0
);//因為答案唯一,所以可以直接退出 }if
(a[n/9]
[n%9])
//該點被填了,就填下乙個點
else}}
}int
main()
}dfs(0
);return0;
}
DFS求解數獨演算法
以前也想過很久解數獨的演算法,但是沒有得到很簡單的方法,某天看到某位學長的 恍然大悟,本以為暴力搜尋會很花時間 10 81種可能 沒想到實際上由於各種限制,列舉次數竟然普遍小於10000次,用dfs便可實現每種可能都列舉。這樣計算乙個數獨就很快了 不到1ms 下面附上自己理解改動並加了注釋的 dev...
回溯演算法 解數獨
假設 判斷 假設 class solution def solve self,arr self.helper arr,0 defhelper self,arr,index if index 81 print arr return else if arr index 0 0代表需要填充資料 for i...
數獨問題 解數獨
數獨是乙個非常有名的遊戲。整個是乙個9x9的大宮格,其中又被劃分成9個3x3的小宮格。要求在每個小格中放入1 9中的某個數字。要求是 每行 每列 每個小宮格中數字不能重複。現要求用計算機求解數獨。輸入描述 輸入9行,每行為空格隔開的9個數字,為0的地方就是需要填充的數字。輸出描述 輸出九行,每行九個...