#include "solver.h" #define add(i,j,k,v) s0[i]^=v,s1[j]^=v,s2[k]^=v Solver::Solver(QObject *parent) : QObject(parent) { srand(time(0));limit=2; for(int i=0;i<1024;++i)idx[i]=0; for(int i=1;i<10;i++)idx[1<>=1; return f; } void Solver::dfs(int t){ if(t==tot+1) ans++; else{ int x=p[t].x,y=p[t].y,z=pos[x][y]; for(int s3=s0[x]&s1[y]&s2[z],i;s3&&ans1) { tmp_m.m[q[i].x][q[i].y]=tmpa; if(symm)tmp_m.m[8-q[i].x][8-q[i].y]=tmpb; } else blank++; } a=tmp_m; return blank; } int Solver::solve(Mat _,int lim){ ans=tot=0;a=_;int flag=a.cnt0()==81;limit=lim; for(int i=1;i<10;i++)s0[i-1]=s1[i-1]=s2[i-1]=1022; for(int i=0;i<9;i++) for(int j=0;j<9;j++){ if(a.m[i][j])add(i,j,pos[i][j],1<r) { tmp_m=a;solve(tmp_m,1); int target=rand()%(r-l+1)+l; for(int i=cnt;i>0&&tmp_m.cnt0()>target;--i) { tmp_m.m[q[i].x][q[i].y]=a.m[q[i].x][q[i].y]; if(symm) tmp_m.m[8-q[i].x][8-q[i].y]=a.m[8-q[i].x][8-q[i].y]; } a=tmp_m; } return a.cnt0(); }