數獨問題 模板

2021-08-21 12:05:21 字數 1602 閱讀 7771

/*

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組測試資料。...