蒟蒻求调(#4,#5 TLE)

P1784 数独

@[wangbochun](/user/942530) ```cpp #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define mx 100100 int sum=0; int a[10][10]; inline int Read(){ int x=0; char c=getchar(); while(c<'0'||c>'9')c=getchar(); while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); return x; } struct DLX{ int n,m,cnt; int l[mx],r[mx],u[mx],d[mx],row[mx],col[mx]; int h[mx]; int s[mx]; int ansk[mx]; void init(int _n,int _m){ n=_n,m=_m; int i; for(i=0;i<=m;i++){ r[i]=i+1;l[i]=i-1;u[i]=d[i]=i; } r[m]=0; l[0]=m; memset(h,-1,sizeof(h)); memset(s,0,sizeof(s)); cnt=m+1; } void link(int R,int C){ s[C]++; row[cnt]=R; col[cnt]=C; u[cnt]=C; d[cnt]=d[C]; u[d[C]]=cnt; d[C]=cnt; if(h[R]<0)h[R]=r[cnt]=l[cnt]=cnt; else{ r[cnt]=h[R]; l[cnt]=l[h[R]]; r[l[h[R]]]=cnt; l[h[R]]=cnt; } cnt++; } void remove(int c){ r[l[c]]=r[c],l[r[c]]=l[c]; for(int i=d[c];i!=c;i=d[i]){ for(int j=r[i];j!=i;j=r[j]){ u[d[j]]=u[j]; d[u[j]]=d[j]; s[col[j]]--; } } } void resume(int c){ for(int i=u[c];i!=c;i=u[i]){ for(int j=l[i];j!=i;j=l[j]){ u[d[j]]=j; d[u[j]]=j; s[col[j]]++; } } r[l[c]]=c; l[r[c]]=c; } bool dance(int deep){ if(r[0]==0){ int x,y,v; for(int i=0;i<deep;i++){ x=(ansk[i]-1)/9/9; y=(ansk[i]-1)/9%9; v=(ansk[i])%9; if(v==0)v=9; a[x][y]=v; } return 1; } int c=r[0]; for(int i=r[0];i!=0;i=r[i])if(s[i]<s[c])c=i; remove(c); for(int i=d[c];i!=c;i=d[i]){ ansk[deep]=row[i]; for(int j=r[i];j!=i;j=r[j]) remove(col[j]); if(dance(deep+1)==1)return 1; for(int j=l[i];j!=i;j=l[j]) resume(col[j]); } resume(c); return false; } }dlx; int main(){ dlx.init(729,324); int x; int o; for(int i=0;i<=8;i++){ for(int j=0;j<=8;j++){ a[i][j]=x=Read(); for(int k=1;k<=9;k++){ if(x!=k&&x!=0)continue; o=i*9*9+j*9+k; dlx.link(o,i*9+j+1); dlx.link(o,i*9+81+k); dlx.link(o,j*9+81*2+k); dlx.link(o,81*3+(i/3*3+j/3)*9+k); } } } dlx.dance(0); for(int i=0;i<=8;i++){ for(int j=0;j<=8;j++)printf("%d ",a[i][j]); printf("\n"); } return 0; } ```结构体......
by luchenxuan2023 @ 2023-11-25 13:03:54


|