poj 3076 Sudoku dlx解数独

来源:互联网 发布:c语言图形界面 编辑:程序博客网 时间:2024/05/19 00:36

16*16的数独,类似poj 3074.

//poj 3076//sep9#include <cstdio>#include <cstdlib>#define INT_MAX  2147483647using namespace std;const int col_num=16*16*4;const int row_num=16*16*16+10; const int head=0;const int MAX=row_num*4+col_num+10;const int delta[]={1,16*16+1,16*16*2+1,16*16*3+1};int cnt[col_num+10],st[col_num+10];int left[MAX],right[MAX],up[MAX],down[MAX];int row[MAX],col[MAX];int K,M;//k:node's idx  M:row's numberstruct ANS{int r,c,k;}ans[MAX];void init(){left[head]=col_num;right[head]=1;up[head]=down[head]=head;for(int i=1;i<=col_num;++i){left[i]=i-1;right[i]=(i+1)%(col_num+1);up[i]=down[i]=i;cnt[i]=0;col[i]=i;row[i]=0;}M=0;K=col_num;}int make_col_head(int c){++K;++cnt[c];col[K]=c;row[K]=M;left[K]=right[K]=K;up[K]=c;down[K]=down[c];up[down[K]]=K;down[up[K]]=K;return K;}void addcol(int ids,int c){++K;++cnt[c];col[K]=c;row[K]=M;left[K]=ids;right[K]=right[ids];left[right[K]]=K;right[left[K]]=K;up[K]=c;down[K]=down[c];up[down[K]]=K;down[up[K]]=K;}void addrow(int i,int j,int k){++M;ans[M].r=i;ans[M].c=j;ans[M].k=k;int ids=make_col_head(16*i+j+delta[0]);addcol(ids,16*i+k+delta[1]);addcol(ids,16*j+k+delta[2]);addcol(ids,16*(i/4*4+j/4)+k+delta[3]);}void remove(int c){left[right[c]]=left[c];right[left[c]]=right[c];for(int i=down[c];i!=c;i=down[i])for(int j=right[i];j!=i;j=right[j]){up[down[j]]=up[j];down[up[j]]=down[j];--cnt[col[j]];}}void resume(int c){for(int i=up[c];i!=c;i=up[i])for(int j=left[i];j!=i;j=left[j]){down[up[j]]=j;up[down[j]]=j;++cnt[col[j]];}left[right[c]]=c;right[left[c]]=c;}bool dfs(int k){if(right[head]==head){char s[300];for(int i=0;i<k;++i)s[ans[st[i]].r*16+ans[st[i]].c]=ans[st[i]].k+'A';for(int i=0;i<16;++i){for(int j=0;j<16;++j)putchar(s[i*16+j]);puts("");}return true;}int s=INT_MAX,c=0;for(int i=right[head];i!=head;i=right[i]){if(cnt[i]<s){s=cnt[i];c=i;}}remove(c);for(int i=down[c];i!=c;i=down[i]){st[k]=row[i];for(int j=right[i];j!=i;j=right[j])remove(col[j]);if(dfs(k+1))return true;for(int j=left[i];j!=i;j=left[j])resume(col[j]);}resume(c);return false;} int main(){char s[20];while(scanf("%s",s)==1){init();for(int j=0;j<16;++j)if(s[j]=='-'){for(int k=0;k<16;++k)addrow(0,j,k);}elseaddrow(0,j,s[j]-'A');for(int i=1;i<16;++i){scanf("%s",s);for(int j=0;j<16;++j)if(s[j]=='-'){for(int k=0;k<16;++k)addrow(i,j,k);}elseaddrow(i,j,s[j]-'A');}dfs(0);puts("");}return 0;}



0 0