C++ 數獨遊戲
直接上代碼:
// 數獨 sudoku
#include <iostream>
using namespace std;
int P[9][9];
bool flag = false;
// 處理輸入
void input(){
char t;
cout << "輸入棋盤,空用 0 表示\n";
for(int i = 0; i < 9; i ++){
for(int j = 0; j < 9; j ++){
cin >> t;
P[i][j] = t - '0';
}
}
}
// 處理輸出
void output(){
for(int i = 0; i < 9; i ++){
for(int j = 0; j < 9; j ++){
if(P[i][j]){
cout << P[i][j];
}else{
cout << " ";
}
if(j%3 == 2) cout << " ";
}
if(i%3 == 2) cout << endl;
cout << endl;
}
}
// 判斷即將放入的 是否符合條件
bool check(int n, int num){
// 行
for(int i = 0; i < 9; i ++){
if(P[n/9][i] == num){
return false;
}
}
// 列
for(int i = 0; i < 9; i ++){
if(P[i][n%9] == num){
return false;
}
}
// 宮
int x = n / 9 / 3 * 3;
int y = n % 9 / 3 * 3;
for(int i = 0; i < 3; i ++){
for(int j = 0; j < 3; j ++){
if(P[x+i][y+j] == num){
return false;
}
}
}
return true;
}
// [n/9][n%9]
void dfs(int n){
// 成功
if(n > 80){
flag = true;
return;
}
int x = n/9, y = n%9;
// 有值 跳過
if(P[x][y]){
dfs(n+1);
return;
}
// 遍歷
for(int i = 1; i <= 9; i ++){
// 判斷
if(check(n, i)){
// 判斷成功 賦值
P[x][y] = i;
dfs(n+1);
// 退出時判斷是否完成 完成時退出
if(flag){
return;
}
// 未完成 重置棋盤
P[x][y] = 0;
}
}
}
int main(){
input();
cout << endl << endl;
dfs(0);
output();
return 0;
}
/*
測試用例
170004000
360810054
008050109
007035048
000000270
000008601
000060080
700000000
000403016
*/
測試用例子結果
百度百科 世界最難數獨
答案秒出, 沒有什麼是暴力解決不了的~
楠少博客同步更新:https://blog.nanshaobit.top/95