Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
dancing links~0ms,attach AC code~# include <iostream> # include <cstring> using namespace std; # define N 250000 struct node { int row,col; int l,r,d,u; }buf[N]; int ccc=324; int co=0,head=0,row,col,cn[1000]; inline int posr(int a) { return 1+col+a; } inline int posc(int a) { return 1+a; } inline int block(int r,int c) { return r/3*3+c/3; } void init(int r,int c) { int i; row=r; col=c; buf[0].u=row+col; buf[0].l=col; buf[0].row=buf[0].col=-1; buf[0].r=1; buf[0].d=col+1; for(i=2;i<=col;i++) buf[i].l=i-1; for(i=1;i<col;i++) buf[i].r=i+1; for(i=1;i<=col;i++) buf[i].u=buf[i].d=i,buf[i].row=-1,buf[i].col=i-1; buf[col].r=0; buf[col+1].u=0; for(i=col+2;i<=col+row;i++) buf[i].u=i-1; for(i=col+1;i<col+row;i++) buf[i].d=i+1; for(i=col+1;i<=col+row;i++) buf[i].l=buf[i].r=i,buf[i].row=i-col-1,buf[i].col=-1; buf[row+col].d=0; co=row+col+1; memset(cn,0,sizeof(cn)); } void insert(int r,int c) { buf[co].row=r; buf[co].col=c; buf[co].u=posc(c); buf[co].d=buf[posc(c)].d; buf[co].l=posr(r); buf[co].r=buf[posr(r)].r; buf[posc(c)].d=co; buf[buf[co].d].u=co; buf[posr(r)].r=co; buf[buf[co].r].l=co++; cn[c]++; } void remove(int c) { int i,j; buf[buf[posc(c)].l].r=buf[posc(c)].r; buf[buf[posc(c)].r].l=buf[posc(c)].l; ccc--; for(i=buf[posc(c)].d;i!=posc(c);i=buf[i].d) { for(j=buf[i].r;j!=i;j=buf[j].r) { buf[buf[j].u].d=buf[j].d; buf[buf[j].d].u=buf[j].u; if(buf[j].col!=-1) cn[buf[j].col]--; } } } void resume(int c) { int j,i; ccc++; for(i=buf[posc(c)].u;i!=posc(c);i=buf[i].u) { for(j=buf[i].l;j!=i;j=buf[j].l) { buf[buf[j].d].u=j; buf[buf[j].u].d=j; if(buf[j].col!=-1) cn[buf[j].col]++; } } buf[buf[posc(c)].r].l=posc(c); buf[buf[posc(c)].l].r=posc(c); } int ans[100][2]; char str[100]; int dfs(int level) { if(buf[head].r==head) { for(int i=0;i<level;i++) { str[ans[i][1]]=ans[i][0]%9+'1'; } for(int i=0;i<81;i++) { cout<<str[i]; if(i%9==8) cout<<endl; } return 1; } else { int maxnum=0xfffffff,pos,i,j; for(i=buf[head].r;i!=head;i=buf[i].r) if(cn[buf[i].col]<maxnum) maxnum=cn[buf[i].col],pos=buf[i].col; remove(pos); for(i=buf[posc(pos)].d;i!=posc(pos);i=buf[i].d) { ans[level][0]=buf[i].row; if(pos<81) ans[level][1]=buf[i].col; for(j=buf[i].r;j!=i;j=buf[j].r) if(buf[j].col!=-1) { remove(buf[j].col); if(buf[j].col<81) ans[level][1]=buf[j].col; } // chk(); if(dfs(level+1)) return 1; for(j=buf[i].l;j!=i;j=buf[j].l) if(buf[j].col!=-1) resume(buf[j].col); } resume(pos); return 0; } } int main() { int testcase; cin>>testcase; while(testcase--) { char tmp[20]; str[0]='\0'; for(int i=0;i<9;i++) { cin>>tmp; strcat(str,tmp); } init(729,324); for(int i=0;i<9;i++) { for(int j=0;j<9;j++) for(int k=0;k<9;k++) { insert(i*81+j*9+k,i*9+j); insert(i*81+j*9+k,81+i*9+k); insert(i*81+j*9+k,81+81+9*j+k); insert(i*81+j*9+k,81+81+81+9*block(i,j)+k); } } for(int i=0;i<9;i++) for(int j=0;j<9;j++) if(str[i*9+j]!='0') { remove(i*9+j); int k; for(k=buf[posc(i*9+j)].d;k!=posc(i*9+j)&&buf[k].row!=i*81+j*9+str[i*9+j]-'1';k=buf[k].d); for(int l=buf[k].r;l!=k;l=buf[l].r) if(buf[l].col!=-1) remove(buf[l].col); } dfs(0); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator