/*
dlx解決9*9的數獨問題,轉化為729*324的精確覆蓋問題
行:一共9 * 9 * 9 == 729行。一共9 * 9小格,每一格有9種可能性(1 - 9),每一種可能都對應著一行。
列:一共(9 + 9 + 9) * 9 + 81 == 324 種前面三個9分別代表著9行9列和9小塊,乘以9的意思是9種可能(1 - 9),因為每種可能只可以選擇乙個。
81代表著81個小格,限制著每乙個小格只放乙個數字。
讀入資料後,如果為'.',則建9行,即有1-9種可能,否則建一行,表示某小格只能放確定的某個數字。
*/#include
#include
#include
using
namespace
std;
const
int inf = 0x7fffffff;
const
int nn = 350;
const
int mm = 750;
#define n 9
int n,m; //列,行
int cntc[nn];
int l[nn*mm],r[nn*mm],u[nn*mm],d[nn*mm];//節點的左邊,右邊,上邊,下邊
int c[nn*mm];
int head;
int mx[mm][nn];
int o[mm],idx;
int ans[10][10];
//刪除列及其相應的行
void remove(int c)
}}//恢復列及其相應的行
void resume(int c)
}}bool dfs()
}remove(c);
for(i = d[c]; i != c; i = d[i])
resume(c);
return
false;
}bool build()
r[n] = 0;
l[0] = n;
//列雙向鍊錶
for(j = 1; j <= n; j++)
}u[j] = pre;
d[pre] = j;
if(cntc[j] == 0)
return
false;
}//行雙向鍊錶
for(i = 1; i <= m; i++)
pre = now;}}
if(first != -1)
}return
true;
}int t;
void print()
if(idx == 0)
printf("impossible\n");
else
cout
map[mm][nn];
string str;
void readdata()
}int main()
}else}}
n = 324;
m = 729;
build();
dfs();
print();
}return
0;}
dfs模板 數獨遊戲
題目鏈結 數獨 1到9,每一行每一列還有九個小的3x3方格 現且僅出現一次 dfs的搜尋,要注意判斷條件,如何判斷我沒有想到,看了別人的做法才知道,還是太弱啊。題不難,但是這是個有趣的問題,借助計算機和dfs,輕鬆成為數獨高手。include include include include incl...
數獨問題 解數獨
數獨是乙個非常有名的遊戲。整個是乙個9x9的大宮格,其中又被劃分成9個3x3的小宮格。要求在每個小格中放入1 9中的某個數字。要求是 每行 每列 每個小宮格中數字不能重複。現要求用計算機求解數獨。輸入描述 輸入9行,每行為空格隔開的9個數字,為0的地方就是需要填充的數字。輸出描述 輸出九行,每行九個...
數獨填充問題
給出乙個4 4的矩陣,在矩陣中填入數字1,2,3,4,使得每行 每列的數字不重複,而且左上角 右上角 左下角 右下角的2 2小矩陣的4個數字不重複。輸入包含多組測試資料。第一行為乙個整數t 1 t 10 表示有t組測試資料。第二行開始為t組測試資料。首先輸出一行 case x x表示第i組測試資料。...