我疯了

P1784 数独

以为JC 。汗 -_-||
by 凉白开27du @ 2018-11-02 12:51:20


现在吸了氧A了,但是时间巨大,麻烦大佬帮我看一看 ```cpp #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; int a[1000]; struct point { int x,y,c; inline void zh(int tt){x=(tt-1)/81+1;y=((tt-1)%81)/9+1;c=((tt-1)%9)+1;} }ans[1000]; struct node { int l,r,u,d,lie,hang; }; struct DLX { node p[210000];int len; int size[1000],last[1000],map[11][11]; bool bol[1000]; inline void make(int l,int r,int u,int d,int lie,int hang){p[len].l=l;p[len].r=r;p[len].u=u;p[len].d=d;p[len].lie=lie;p[len].hang=hang;} inline void sxdel(int x){p[p[x].u].d=p[x].d;p[p[x].d].u=p[x].u;} inline void nsxdel(int x){p[p[x].u].d=p[p[x].d].u=x;} inline void zydel(int x){p[p[x].l].r=p[x].r;p[p[x].r].l=p[x].l;} inline void nzydel(int x){p[p[x].l].r=p[p[x].r].l=x;} inline void clear(int x) { len=0;p[0].l=p[0].r=p[0].u=p[0].d=0; for(int i=1;i<=x;i++) { len++;make(i-1,p[i-1].r,i,i,i,0); nzydel(i);size[i]=0;last[i]=i; } } inline void add(int row) { if(!a[0])return ; len++;make(len,len,last[a[1]],p[last[a[1]]].d,a[1],row); nsxdel(len);size[a[1]]++;last[a[1]]=len; for(int i=2;i<=a[0];i++) { len++;make(len-1,p[len-1].r,last[a[i]],p[last[a[i]]].d,a[i],row); nsxdel(len);nzydel(len);size[a[i]]++;last[a[i]]=len; } } inline void del(int x) { zydel(x); for(int i=p[x].u;i!=x;i=p[i].u) { for(int j=p[i].r;j!=i;j=p[j].r) { sxdel(j),size[p[j].lie]--; } } } inline void back(int x) { nzydel(x); for(int i=p[x].u;i!=x;i=p[i].u) { for(int j=p[i].r;j!=i;j=p[j].r)nsxdel(j),size[p[j].lie]++; } } inline bool dance(int x) { if(!p[0].r) { for(int i=1;i<=x;i++) { map[ans[i].x][ans[i].y]=ans[i].c; } for(int i=1;i<=9;i++) { for(int j=1;j<=8;j++)printf("%d ",map[i][j]); printf("%d\n",map[i][9]); } return true; } int first=0,mi=999999999; for(int i=p[0].r;i;i=p[i].r) { if(size[p[i].lie]<mi)mi=size[p[i].lie],first=p[i].lie; } if(mi==0)return false; del(first); for(int i=p[first].u;i!=first;i=p[i].u) { for(int j=p[i].l;j!=i;j=p[j].l)del(p[j].lie); ans[x+1].zh(p[i].hang); if(dance(x+1))return true; for(int j=p[i].l;j!=i;j=p[j].l)back(p[j].lie); } back(first); return false; } }dlx; int main() { memset(dlx.bol,false,sizeof(dlx.bol)); dlx.clear(4*9*9); for(int i=1;i<=9;i++) { for(int j=1;j<=9;j++) { scanf("%d",&dlx.map[i][j]); if(dlx.map[i][j]) { dlx.bol[(i-1)*9+j]=true; // dlx.del((i-1)*9+j); dlx.bol[81+(i-1)*9+dlx.map[i][j]]=true; // dlx.del(81+(i-1)*9+dlx.map[i][j]); dlx.bol[162+(j-1)*9+dlx.map[i][j]]=true; // dlx.del(162+(j-1)*9+dlx.map[i][j]); dlx.bol[243+(((i-1)/3)*3+(j-1)/3)*9+dlx.map[i][j]]=true; // dlx.del(243+(((i-1)/3)*3+(j-1)/3)*9+dlx.map[i][j]); } else { for(int k=1;k<=9;k++) { if(!dlx.bol[81+(i-1)*9+k] && !dlx.bol[162+(j-1)*9+k] && !dlx.bol[243+(((i-1)/3)*3+(j-1)/3)*9+k]) { a[0]=0; a[++a[0]]=(i-1)*9+j; a[++a[0]]=81+(i-1)*9+k; a[++a[0]]=162+(j-1)*9+k; a[++a[0]]=243+(((i-1)/3)*3+(j-1)/3)*9+k; dlx.add((i-1)*81+(j-1)*9+k); } } } } } for(int i=1;i<=324;i++) { if(dlx.bol[i])dlx.del(i); } dlx.dance(0); return 0; } ```
by 爱喝敌敌畏 @ 2018-11-02 14:21:26


|