#include<iostream>
int nch[9][9]={0};
void getran(int a[])
{
int b[9]={1,2,3,4,5,6,7,8,9};
int n=0;
for (int i=0;i<9;++i)
{
n=rand()%(9-i);a[i]=b[n];
for (int g=n;g<8;++g)
b[g]=b[g+1];
}
}
bool isfull(int x,int y)
{
for (int i=x;i<x+3;++i)
for (int j=y;j<y+3;++j)
if (nch[i][j]==0)
return false;
return true;
}
bool check(int x,int y ,int z)
{
for(int i=0;i<9;++i)
if(nch[x][i]==z&&i!=y)
return false;
for(int i=0;i<9;++i)
if(nch[i][y]==z&&i!=x)
return false;
int a1=0,b1=0,a2=0,b2=0;
if (x%3==0)
{
a1=x;
b1=x+3;
}
else
{
a1=b1=x;
while(a1%3!=0)
{--a1;}
while(b1%3!=0)
{++b1;}
}
if (y%3==0)
{
a2=y;
b2=y+3;
}
else
{
a2=b2=y;
while(a2%3!=0)
{--a2;}
while(b2%3!=0)
{++b2;}
}
for(int i=a1;i<b1;++i)
for(int j=a2;j<b2;++j)
if (i!=x&&j!=y)
if(nch[i][j]==z)
return false;
return true;
}
void fill_it(int x1,int y1,int x2,int y2)
{
int n1=0,n2=0;int d=0;int f[9]={0};
if (x2==0&&y2==0)
{
d=y1;
for (int i=0;i<3;++i)
{
do
{
if (rand()%2==1)
n1=x1-1;
else
n1=x1-2;
n2=rand()%3+3+y1;
}while(nch[n1][n2]!=0||!check(n1,n2,nch[x1][d]));
nch[n1][n2]=nch[x1][d];
++d;
}
getran(f);
for (int i=x1-2;i<x1+1;++i)
for(int j=y1+3;j<y1+6;++j)
if (nch[i][j]==0)
for (int u=0;u<9;++u)
if(check(i,j,f[u]))
{
nch[i][j]=f[u];
break;
}
}
if (x1==0&&y1==0)
{
d=x2;
for (int i=0;i<3;++i)
{
do
{
if (rand()%2==1)
n2=y2-1;
else
n2=y2-2;
n1=rand()%3+3+x2;
}while(nch[n1][n2]!=0||!check(n1,n2,nch[d][y2]));
nch[n1][n2]=nch[d][y2];
++d;
}
getran(f);
for(int j=y2-2;j<y2+1;++j)
for (int i=x2+3;i<x2+6;++i)
if(nch[i][j]==0)
for (int u=0;u<9;++u)
if(check(i,j,f[u]))
{
nch[i][j]=f[u];
break;
}
}
}
void stepfirst()
{
for(int i=0;i<9;++i)
for(int j=0;j<9;++j)
nch[i][j]=0;
int f[9]={0};
getran(f);int m=0;
for (int j=0;j<3;++j)
for (int h=0;h<3;++h)
{
nch[j][h]=f[m];++m;
}
fill_it(2,0,0,0);
fill_it(2,3,0,0);
fill_it(0,0,0,2);
fill_it(0,0,3,2);
while (!isfull(3,3)||!isfull(6,6)){
for (int i=3;i<9;++i)
for (int j=3;j<9;++j)
nch[i][j]=0;
do {
for(int i=6;i<9;++i)
for (int j=3;j<6;++j)
nch[i][j]=0;
fill_it(8,0,0,0);
}while(!isfull(6,3));
do{
for(int i=3;i<6;++i)
for(int j=6;j<9;++j)
nch[i][j]=0;
fill_it(0,0,0,8);
}while(!isfull(3,6));
for(int i=3;i<6;++i)
for(int j=3;j<6;++j)
for (int u=0;u<9;++u)
{
if(check(i,j,f[u]))
{nch[i][j]=f[u];break;}
}
for(int i=6;i<9;++i)
for(int j=6;j<9;++j)
for (int u=0;u<9;++u)
{
if(check(i,j,f[u]))
{nch[i][j]=f[u];break;}
}
}
}
#include<iostream>
#include<ctime>
#include<cstdlib>
using std::ostream;
using std::cout;
using std::cin;
using std::endl;
class set
{
private:
int e[9];
public:
set(const int []);
set();
~set();
set operator-(const set& s)const ;
set operator*(const set& s)const;
set operator+(const set& s)const;
set& operator=(const set& s);
friend ostream & operator<<(ostream& os,const set& s);
bool itis(int n);
set& operator=(int n);
int cal();
};
set::set()
{
for(int i=0;i<9;++i)
e[i]=0;
}
set::set(const int a[])
{
for(int i=0;i<9;++i)
e[i]=a[i];
}
set::~set()
{
}
set set::operator-(const set& s)const
{
set f;
for (int i=0;i<9;++i)
if (e[i]!=0&&s.e[i]==0)
f.e[i]=e[i];
return f;
}
set set::operator*(const set& s)const
{
set f;
for (int i=0;i<9;++i)
if(e[i]!=0&&s.e[i]!=0&&e[i]==s.e[i])
f.e[i]=e[i];
return f;
}
set& set::operator=(const set& s)
{
for (int i=0;i<9;++i)
e[i]=s.e[i];
return *this;
}
ostream& operator<<(ostream& os ,const set& s)
{
for (int i=0;i<9;++i)
if (s.e[i]!=0)
os<<s.e[i]<<' ';
return os;
}
int set::cal()
{
int y=0;
for (int i=0;i<9;++i)
if (e[i]!=0)
++y;
return y;
}
set& set::operator=(int n)
{
if (n!=0)
{
for(int j=0;j<9;++j)
e[j]=0;
e[n-1]=n;
}
else
for(int i=0;i<9;++i)
e[i]=0;
return *this;
}
set set::operator+(const set& s)const
{
set f;
for(int i=0;i<9;++i){
if(e[i]!=0)
f.e[i]=e[i];
if(s.e[i]!=0)
f.e[i]=s.e[i];
}
return f;
}
bool set::itis(int n)
{
for(int i=0;i<9;++i)
if(e[i]==n)
return true;
return false;
}
#include"firststep.h"
#include"sudoku.h"
set cell[9][9];
const int fullset[9]={1,2,3,4,5,6,7,8,9};
bool isolve(set z[][9]);
void checkit(int& x,int& y,int& a1,int& b1,int & a2,int &b2,set z[][9]);
void displayall();
void solved(set z[][9]);
void solved1(set z[][9]);
void solved2(set z[][9]);
void solved3(set z[][9]);
void solved4(set z[][9]);
void solved5(set z[][9]);
void solved6(set z[][9]);
void solved7(set z[][9]);
void Xwing2(set z[][9]);
void Xwing3(set z[][9]);
void Xwing4(set z[][9]);
void solvecell(set z[][9]);
int main()
{
srand(time(0));
int x=0,y=0;
set s;
do
{
cout<<"\n";
stepfirst();
do{
for (int i=0;i<9;++i)
for (int j=0;j<9;++j)
cell[i][j]=nch[i][j];
for(int i=0;i<9;++i)
for(int j=0;j<9;++j)
if(rand()%9>4)
cell[i][j]=0;
//displayall();
}while(!isolve(cell));
int b[81]={0},w[81]={0};
for(int i=0;i<81;++i)
b[i]=i;
int n=0;
for (int i=0;i<81;++i)
{
n=rand()%(81-i);w[i]=b[n];
for (int g=n;g<80;++g)
b[g]=b[g+1];
}
for(int i=0;i<81;++i)
{
y=w[i]%9;x=(w[i]-y)/9;
if(cell[x][y].cal()==1)
{
s=cell[x][y];
cell[x][y]=0;
if(!isolve(cell))
cell[x][y]=s;
}
}
displayall();
cout<<"Press enter to continue.";
}while(cin.get()=='\n');
// set ss[9][9];
//ss[1][0]=1;ss[1][1]=1;
//ss[2][5]=1;
//for(int i=0;i<9;++i)
// for(int j=0;j<9;++j)
// cell[i][j]=ss[i][j];
//displayall();
//solved(cell);
//for(int i=0;i<1;++i){
//
// solved1(cell);
//solved2(cell);
//solved3(cell);
//solved4(cell);
//solved5(cell);
//solved6(cell);
//solved7(cell);
//solvecell(cell);
//Xwing2(cell);
//Xwing3(cell);
//Xwing4(cell);
//}
//displayall();
//for(int i=0;i<9;++i)
//cout<<cell[ 3][i]<<endl;
}
void checkit(int& x,int& y,int& a1,int& b1,int & a2,int &b2,set z[][9])
{
set u(fullset),s(fullset),d(fullset);
if (x%3==0)
{
a1=x;
b1=x+3;
}
else
{
a1=b1=x;
while(a1%3!=0)
{--a1;}
while(b1%3!=0)
{++b1;}
}
if (y%3==0)
{
a2=y;
b2=y+3;
}
else
{
a2=b2=y;
while(a2%3!=0)
{--a2;}
while(b2%3!=0)
{++b2;}
}
for(int i=0;i<9;++i)
if(i!=y&&z[x][i].cal()==1)
u=u-z[x][i];
for(int j=0;j<9;++j)
if(j!=x&&z[j][y].cal()==1)
s=s-z[j][y];
for (int i=a1;i<b1;++i)
for(int j=a2;j<b2;++j)
if(i!=x&&j!=y)
if(z[i][j].cal()==1)
d=d-z[i][j];
z[x][y]=z[x][y]*d*u*s;
}
void solved(set z[][9])
{
int a1=0, b1=0,a2=0,b2=0;set u,s,d,r(fullset);
for(int q=0;q<2;++q)
for(int x=0;x<9;++x)
for(int y=0;y<9;++y)
if(z[x][y].cal()!=1)
{
if (x%3==0)
{
a1=x;
b1=x+3;
}
else
{
a1=b1=x;
while(a1%3!=0)
{--a1;}
while(b1%3!=0)
{++b1;}
}
if (y%3==0)
{
a2=y;
b2=y+3;
}
else
{
a2=b2=y;
while(a2%3!=0)
{--a2;}
while(b2%3!=0)
{++b2;}
}
u=s=d=r;
for(int i=0;i<9;++i)
if(i!=y&&z[x][i].cal()==1)
u=u-z[x][i];
for(int j=0;j<9;++j)
if(j!=x&&z[j][y].cal()==1)
s=s-z[j][y];
for (int i=a1;i<b1;++i)
for(int j=a2;j<b2;++j)
if(i!=x&&j!=y)
if(z[i][j].cal()==1)
d=d-z[i][j];
z[x][y]=d*u*s;
}
}
void solved1(set z[][9])
{
set e,f;int a1=0,b1=0,a2=0,b2=0;
for(int q=0;q<2;++q)
for(int x=0;x<9;++x)
for(int y=0;y<9;++y)
if(z[x][y].cal()!=1)
{
checkit(x,y,a1,b1,a2,b2,z);
if(z[x][y].cal()!=1){
e=0;
for(int i=0;i<9;++i)
if(i!=x&&z[i][y].cal()!=1)
e=e+z[i][y];
if((z[x][y]-e*z[x][y]).cal()!=0)
z[x][y]=z[x][y]-e*z[x][y];
}
if(z[x][y].cal()!=1){
e=0;
for(int j=0;j<9;++j)
if(j!=y&&z[x][j].cal()!=1)
e=e+z[x][j];
if((z[x][y]-e*z[x][y]).cal()!=0)
z[x][y]=z[x][y]-e*z[x][y];
}
if(z[x][y].cal()!=1){
f=z[x][y];e=z[x][y]=0;
for(int i=a1;i<b1;++i)
for(int j=a2;j<b2;++j)
if(z[i][j].cal()!=1)
e=e+z[i][j];
z[x][y]=f;
if((z[x][y]-e*z[x][y]).cal()!=0)
z[x][y]=z[x][y]-e*z[x][y];
}
}
}
void solved2(set z[][9])
{
set e,f,r(fullset);int a1=0,b1=0,a2=0,b2=0;int n=0;
set ss[9];
for(int q=0;q<2;++q)
for(int x=0;x<9;++x)
for(int y=0;y<9;++y)
if(z[x][y].cal()!=1)
{
checkit(x,y,a1,b1,a2,b2,z);
if(z[x][y].cal()!=1){
n=0;
for(int i=0;i<9;++i)
if(i!=x&&z[i][y].cal()!=1&&z[i][y].cal()<3)
{
ss[n]=z[i][y];
++n;
}
for(int k1=0;k1<n-1;++k1)
for(int k2=k1+1;k2<n;++k2)
if((ss[k1]+ss[k2]).cal()==2)
{
e=ss[k1]+ss[k2];
z[x][y]=z[x][y]*(r-e);
}
}
if(z[x][y].cal()!=1){
n=0;
for(int j=0;j<9;++j)
if(j!=y&&z[x][j].cal()!=1&&z[x][j].cal()<3)
{
ss[n]=z[x][j];
++n;
}
for(int k1=0;k1<n-1;++k1)
for(int k2=k1+1;k2<n;++k2)
if((ss[k1]+ss[k2]).cal()==2)
{
e=ss[k1]+ss[k2];
z[x][y]=z[x][y]*(r-e);
}
}
if(z[x][y].cal()!=1){
n=0;
f=z[x][y];z[x][y]=0;
for(int i=a1;i<b1;++i)
for(int j=a2;j<b2;++j)
if(z[i][j].cal()!=1&&z[i][j].cal()<3&&z[i][j].cal()!=0){
ss[n]=z[i][j];++n;
}
z[x][y]=f;
for(int k1=0;k1<n-1;++k1)
for(int k2=k1+1;k2<n;++k2)
if((ss[k1]+ss[k2]).cal()==2)
{
e=ss[k1]+ss[k2];
z[x][y]=z[x][y]*(r-e);
}
}
}
}
void solved3(set z[][9])
{
set e,f,r(fullset);int a1=0,b1=0,a2=0,b2=0;int n=0;
set ss[9];
for(int q=0;q<2;++q)
for(int x=0;x<9;++x)
for(int y=0;y<9;++y)
if(z[x][y].cal()!=1)
{
checkit(x,y,a1,b1,a2,b2,z);
if(z[x][y].cal()!=1){
n=0;
for(int i=0;i<9;++i)
if(i!=x&&z[i][y].cal()!=1&&z[i][y].cal()<4)
{
ss[n]=z[i][y];
++n;
}
for(int k1=0;k1<n-2;++k1)
for(int k2=k1+1;k2<n-1;++k2)
for(int k3=k2+1;k3<n;++k3)
if((ss[k1]+ss[k2]+ss[k3]).cal()==3)
{
e=ss[k1]+ss[k2]+ss[k3];
z[x][y]=z[x][y]*(r-e);
}
}
if(z[x][y].cal()!=1){
n=0;
for(int j=0;j<9;++j)
if(j!=y&&z[x][j].cal()!=1&&z[x][j].cal()<4)
{
ss[n]=z[x][j];
++n;
}
for(int k1=0;k1<n-2;++k1)
for(int k2=k1+1;k2<n-1;++k2)
for(int k3=k2+1;k3<n;++k3)
if((ss[k1]+ss[k2]+ss[k3]).cal()==3)
{
e=ss[k1]+ss[k2]+ss[k3];
z[x][y]=z[x][y]*(r-e);
}
}
if(z[x][y].cal()!=1){
n=0;
f=z[x][y];z[x][y]=0;
for(int i=a1;i<b1;++i)
for(int j=a2;j<b2;++j)
if(z[i][j].cal()!=1&&z[i][j].cal()<4&&z[i][j].cal()!=0){
ss[n]=z[i][j];++n;
}
z[x][y]=f;
for(int k1=0;k1<n-2;++k1)
for(int k2=k1+1;k2<n-1;++k2)
for(int k3=k2+1;k3<n;++k3)
if((ss[k1]+ss[k2]+ss[k3]).cal()==3)
{
e=ss[k1]+ss[k2]+ss[k3];
z[x][y]=z[x][y]*(r-e);
}
}
}
}
void solved4(set z[][9])
{
set e,f,r(fullset);int a1=0,b1=0,a2=0,b2=0;int n=0;
set ss[9];
for(int q=0;q<2;++q)
for(int x=0;x<9;++x)
for(int y=0;y<9;++y)
if(z[x][y].cal()!=1)
{
checkit(x,y,a1,b1,a2,b2,z);
if(z[x][y].cal()!=1){
n=0;
for(int i=0;i<9;++i)
if(i!=x&&z[i][y].cal()!=1&&z[i][y].cal()<5)
{
ss[n]=z[i][y];
++n;
}
for(int k1=0;k1<n-3;++k1)
for(int k2=k1+1;k2<n-2;++k2)
for(int k3=k2+1;k3<n-1;++k3)
for(int k4=k3+1;k4<n;++k4)
if( (ss[k1]+ss[k2]+ss[k3]+ss[k4]).cal()==4)
{
e=ss[k1]+ss[k2]+ss[k3]+ss[k4];
z[x][y]=z[x][y]*(r-e);
}
}
if(z[x][y].cal()!=1){
n=0;
for(int j=0;j<9;++j)
if(j!=y&&z[x][j].cal()!=1&&z[x][j].cal()<5)
{
ss[n]=z[x][j];
++n;
}
for(int k1=0;k1<n-3;++k1)
for(int k2=k1+1;k2<n-2;++k2)
for(int k3=k2+1;k3<n-1;++k3)
for(int k4=k3+1;k4<n;++k4)
if( (ss[k1]+ss[k2]+ss[k3]+ss[k4]).cal()==4)
{
e=ss[k1]+ss[k2]+ss[k3]+ss[k4];
z[x][y]=z[x][y]*(r-e);
}
}
if(z[x][y].cal()!=1){
n=0;
f=z[x][y];z[x][y]=0;
for(int i=a1;i<b1;++i)
for(int j=a2;j<b2;++j)
if(z[i][j].cal()!=1&&z[i][j].cal()<5&&z[i][j].cal()!=0){
ss[n]=z[i][j];++n;
}
z[x][y]=f;
for(int k1=0;k1<n-3;++k1)
for(int k2=k1+1;k2<n-2;++k2)
for(int k3=k2+1;k3<n-1;++k3)
for(int k4=k3+1;k4<n;++k4)
if( (ss[k1]+ss[k2]+ss[k3]+ss[k4]).cal()==4)
{
e=ss[k1]+ss[k2]+ss[k3]+ss[k4];
z[x][y]=z[x][y]*(r-e);
}
}
}
}
void solved5(set z[][9])
{
set e,f,r(fullset);int a1=0,b1=0,a2=0,b2=0;int n=0;
set ss[9];
for(int q=0;q<2;++q)
for(int x=0;x<9;++x)
for(int y=0;y<9;++y)
if(z[x][y].cal()!=1)
{
checkit(x,y,a1,b1,a2,b2,z);
if(z[x][y].cal()!=1){
n=0;
for(int i=0;i<9;++i)
if(i!=x&&z[i][y].cal()!=1&&z[i][y].cal()<6)
{
ss[n]=z[i][y];
++n;
}
for(int k1=0;k1<n-4;++k1)
for(int k2=k1+1;k2<n-3;++k2)
for(int k3=k2+1;k3<n-2;++k3)
for(int k4=k3+1;k4<n-1;++k4)
for(int k5=k4+1;k5<n;++k5)
if((ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]).cal()==5)
{
e=ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5];
z[x][y]=z[x][y]*(r-e);
}
}
if(z[x][y].cal()!=1){
n=0;
for(int j=0;j<9;++j)
if(j!=y&&z[x][j].cal()!=1&&z[x][j].cal()<6)
{
ss[n]=z[x][j];
++n;
}
for(int k1=0;k1<n-4;++k1)
for(int k2=k1+1;k2<n-3;++k2)
for(int k3=k2+1;k3<n-2;++k3)
for(int k4=k3+1;k4<n-1;++k4)
for(int k5=k4+1;k5<n;++k5)
if((ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]).cal()==5)
{
e=ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5];
z[x][y]=z[x][y]*(r-e);
}
}
if(z[x][y].cal()!=1){
n=0;
f=z[x][y];z[x][y]=0;
for(int i=a1;i<b1;++i)
for(int j=a2;j<b2;++j)
if(z[i][j].cal()!=1&&z[i][j].cal()<6&&z[i][j].cal()!=0){
ss[n]=z[i][j];++n;
}
z[x][y]=f;
for(int k1=0;k1<n-4;++k1)
for(int k2=k1+1;k2<n-3;++k2)
for(int k3=k2+1;k3<n-2;++k3)
for(int k4=k3+1;k4<n-1;++k4)
for(int k5=k4+1;k5<n;++k5)
if((ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]).cal()==5)
{
e=ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5];
z[x][y]=z[x][y]*(r-e);
}
}
}
}
void solved6(set z[][9])
{
set e,f,r(fullset);int a1=0,b1=0,a2=0,b2=0;int n=0;
set ss[9];
for(int q=0;q<2;++q)
for(int x=0;x<9;++x)
for(int y=0;y<9;++y)
if(z[x][y].cal()!=1)
{
checkit(x,y,a1,b1,a2,b2,z);
if(z[x][y].cal()!=1){
n=0;
for(int i=0;i<9;++i)
if(i!=x&&z[i][y].cal()!=1&&z[i][y].cal()<7)
{
ss[n]=z[i][y];
++n;
}
for(int k1=0;k1<n-5;++k1)
for(int k2=k1+1;k2<n-4;++k2)
for(int k3=k2+1;k3<n-3;++k3)
for(int k4=k3+1;k4<n-2;++k4)
for(int k5=k4+1;k5<n-1;++k5)
for(int k6=k5+1;k6<n;++k6)
if((ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]+ss[k6]).cal()==6)
{
e=ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]+ss[k6];
z[x][y]=z[x][y]*(r-e);
}
}
if(z[x][y].cal()!=1){
n=0;
for(int j=0;j<9;++j)
if(j!=y&&z[x][j].cal()!=1&&z[x][j].cal()<7)
{
ss[n]=z[x][j];
++n;
}
for(int k1=0;k1<n-5;++k1)
for(int k2=k1+1;k2<n-4;++k2)
for(int k3=k2+1;k3<n-3;++k3)
for(int k4=k3+1;k4<n-2;++k4)
for(int k5=k4+1;k5<n-1;++k5)
for(int k6=k5+1;k6<n;++k6)
if((ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]+ss[k6]).cal()==6)
{
e=ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]+ss[k6];
z[x][y]=z[x][y]*(r-e);
}
}
if(z[x][y].cal()!=1){
n=0;
f=z[x][y];z[x][y]=0;
for(int i=a1;i<b1;++i)
for(int j=a2;j<b2;++j)
if(z[i][j].cal()!=1&&z[i][j].cal()<7&&z[i][j].cal()!=0){
ss[n]=z[i][j];++n;
}
z[x][y]=f;
for(int k1=0;k1<n-5;++k1)
for(int k2=k1+1;k2<n-4;++k2)
for(int k3=k2+1;k3<n-3;++k3)
for(int k4=k3+1;k4<n-2;++k4)
for(int k5=k4+1;k5<n-1;++k5)
for(int k6=k5+1;k6<n;++k6)
if((ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]+ss[k6]).cal()==6)
{
e=ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]+ss[k6];
z[x][y]=z[x][y]*(r-e);
}
}
}
}
void solved7(set z[][9])
{
set e,f,r(fullset);int a1=0,b1=0,a2=0,b2=0;int n=0;
set ss[9];
for(int q=0;q<2;++q)
for(int x=0;x<9;++x)
for(int y=0;y<9;++y)
if(z[x][y].cal()!=1)
{
checkit(x,y,a1,b1,a2,b2,z);
if(z[x][y].cal()!=1){
n=0;
for(int i=0;i<9;++i)
if(i!=x&&z[i][y].cal()!=1&&z[i][y].cal()<8)
{
ss[n]=z[i][y];
++n;
}
for(int k1=0;k1<n-6;++k1)
for(int k2=k1+1;k2<n-5;++k2)
for(int k3=k2+1;k3<n-4;++k3)
for(int k4=k3+1;k4<n-3;++k4)
for(int k5=k4+1;k5<n-2;++k5)
for(int k6=k5+1;k6<n-1;++k6)
for(int k7=k6+1;k7<n;++k7)
if((ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]+ss[k6]+ss[k7]).cal()==7)
{
e=ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]+ss[k6]+ss[k7];
z[x][y]=z[x][y]*(r-e);
}
}
if(z[x][y].cal()!=1){
n=0;
for(int j=0;j<9;++j)
if(j!=y&&z[x][j].cal()!=1&&z[x][j].cal()<8)
{
ss[n]=z[x][j];
++n;
}
for(int k1=0;k1<n-6;++k1)
for(int k2=k1+1;k2<n-5;++k2)
for(int k3=k2+1;k3<n-4;++k3)
for(int k4=k3+1;k4<n-3;++k4)
for(int k5=k4+1;k5<n-2;++k5)
for(int k6=k5+1;k6<n-1;++k6)
for(int k7=k6+1;k7<n;++k7)
if((ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]+ss[k6]+ss[k7]).cal()==7)
{
e=ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]+ss[k6]+ss[k7];
z[x][y]=z[x][y]*(r-e);
}
}
if(z[x][y].cal()!=1){
n=0;
f=z[x][y];z[x][y]=0;
for(int i=a1;i<b1;++i)
for(int j=a2;j<b2;++j)
if(z[i][j].cal()!=1&&z[i][j].cal()<8&&z[i][j].cal()!=0){
ss[n]=z[i][j];++n;
}
z[x][y]=f;
for(int k1=0;k1<n-6;++k1)
for(int k2=k1+1;k2<n-5;++k2)
for(int k3=k2+1;k3<n-4;++k3)
for(int k4=k3+1;k4<n-3;++k4)
for(int k5=k4+1;k5<n-2;++k5)
for(int k6=k5+1;k6<n-1;++k6)
for(int k7=k6+1;k7<n;++k7)
if((ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]+ss[k6]+ss[k7]).cal()==7)
{
e=ss[k1]+ss[k2]+ss[k3]+ss[k4]+ss[k5]+ss[k6]+ss[k7];
z[x][y]=z[x][y]*(r-e);
}
}
}
}
void Xwing2(set z[][9])
{
int n=0,u=0;set e;int m[2]={0};
for(int n1=0;n1<8;++n1)
for(int n2=n1+1;n2<9;++n2)
{
for(int j=1;j<10;++j){
n=u=0;e=j;
for(int i=0;i<9;++i)
if(z[n1][i].itis(j)&&z[n2][i].itis(j))
{
if(n<2)
m[n]=i;
++n;
}
else
if(z[n1][i].itis(j)||z[n2][i].itis(j))
++u;
if(n==2&&u==0)
{
for(int i=0;i<9;++i)
if(z[i][m[0]].cal()!=1&&i!=n1&&i!=n2)
z[i][m[0]]=z[i][m[0]]-e;
for(int i=0;i<9;++i)
if(z[i][m[1]].cal()!=1&&i!=n1&&i!=n2)
z[i][m[1]]=z[i][m[1]]-e;
}
}
}
for(int n1=0;n1<8;++n1)
for(int n2=n1+1;n2<9;++n2)
{
for(int j=1;j<10;++j){
n=u=0;e=j;
for(int i=0;i<9;++i)
if(z[i][n1].itis(j)&&z[i][n2].itis(j))
{
if(n<2)
m[n]=i;
++n;
}
else
if(z[i][n1].itis(j)||z[i][n2].itis(j))
++u;
if(n==2&&u==0)
{
for(int i=0;i<9;++i)
if(z[m[0]][i].cal()!=1&&i!=n1&&i!=n2)
z[m[0]][i]=z[m[0]][i]-e;
for(int i=0;i<9;++i)
if(z[m[1]][i].cal()!=1&&i!=n1&&i!=n2)
z[m[1]][i]=z[m[1]][i]-e;
}
}
}
}
void Xwing3(set z[][9])
{
int n=0,u=0;set e;int m[3]={0};
for(int n1=0;n1<7;++n1)
for(int n2=n1+1;n2<8;++n2)
for(int n3=n2+1;n3<9;++n3)
{
for(int j=1;j<10;++j){
n=u=0;e=j;
for(int i=0;i<9;++i)
if(z[n1][i].itis(j)&&z[n2][i].itis(j)&&z[n3][i].itis(j))
{
if(n<3)
m[n]=i;
++n;
}
else
if(z[n1][i].itis(j)||z[n2][i].itis(j)||z[n3][i].itis(j))
++u;
if(n==3&&u==0)
{
for(int i=0;i<9;++i)
if(z[i][m[0]].cal()!=1&&i!=n1&&i!=n2&&i!=n3)
z[i][m[0]]=z[i][m[0]]-e;
for(int i=0;i<9;++i)
if(z[i][m[1]].cal()!=1&&i!=n1&&i!=n2&&i!=n3)
z[i][m[1]]=z[i][m[1]]-e;
for(int i=0;i<9;++i)
if(z[i][m[2]].cal()!=1&&i!=n1&&i!=n2&&i!=n3)
z[i][m[2]]=z[i][m[2]]-e;
}
}
}
for(int n1=0;n1<7;++n1)
for(int n2=n1+1;n2<8;++n2)
for(int n3=n2+1;n3<9;++n3)
{
for(int j=1;j<10;++j){
n=u=0;e=j;
for(int i=0;i<9;++i)
if(z[i][n1].itis(j)&&z[i][n2].itis(j)&&z[i][n3].itis(j))
{
if(n<3)
m[n]=i;
++n;
}
else
if(z[i][n1].itis(j)||z[i][n2].itis(j)||z[i][n3].itis(j))
++u;
if(n==3&&u==0)
{
for(int i=0;i<9;++i)
if(z[m[0]][i].cal()!=1&&i!=n1&&i!=n2&&i!=n3)
z[m[0]][i]=z[m[0]][i]-e;
for(int i=0;i<9;++i)
if(z[m[1]][i].cal()!=1&&i!=n1&&i!=n2&&i!=n3)
z[m[1]][i]=z[m[1]][i]-e;
for(int i=0;i<9;++i)
if(z[m[2]][i].cal()!=1&&i!=n1&&i!=n2&&i!=n3)
z[m[2]][i]=z[m[2]][i]-e;
}
}
}
}
void Xwing4(set z[][9])
{
int n=0,u=0;set e;int m[4]={0};
for(int n1=0;n1<6;++n1)
for(int n2=n1+1;n2<7;++n2)
for(int n3=n2+1;n3<8;++n3)
for(int n4=n3+1;n4<9;++n4)
{
for(int j=1;j<10;++j){
n=u=0;e=j;
for(int i=0;i<9;++i)
if(z[n1][i].itis(j)&&z[n2][i].itis(j)&&
z[n3][i].itis(j)&&z[n4][i].itis(j))
{
if(n<4)
m[n]=i;
++n;
}
else
if(z[n1][i].itis(j)||z[n2][i].itis(j)
||z[n3][i].itis(j)||z[n4][i].itis(j))
++u;
if(n==4&&u==0)
{
for(int i=0;i<9;++i)
if(z[i][m[0]].cal()!=1&&i!=n1&&i!=n2&&i!=n3&&i!=n4)
z[i][m[0]]=z[i][m[0]]-e;
for(int i=0;i<9;++i)
if(z[i][m[1]].cal()!=1&&i!=n1&&i!=n2&&i!=n3&&i!=n4)
z[i][m[1]]=z[i][m[1]]-e;
for(int i=0;i<9;++i)
if(z[i][m[2]].cal()!=1&&i!=n1&&i!=n2&&i!=n3&&i!=n4)
z[i][m[2]]=z[i][m[2]]-e;
for(int i=0;i<9;++i)
if(z[i][m[3]].cal()!=1&&i!=n1&&i!=n2&&i!=n3&&i!=n4)
z[i][m[3]]=z[i][m[3]]-e;
}
}
}
for(int n1=0;n1<6;++n1)
for(int n2=n1+1;n2<7;++n2)
for(int n3=n2+1;n3<8;++n3)
for(int n4=n3+1;n4<9;++n4)
{
for(int j=1;j<10;++j){
n=u=0;e=j;
for(int i=0;i<9;++i)
if(z[i][n1].itis(j)&&z[i][n2].itis(j)&&
z[i][n3].itis(j)&&z[i][n4].itis(j))
{
if(n<4)
m[n]=i;
++n;
}
else
if(z[i][n1].itis(j)||z[i][n2].itis(j)||
z[i][n3].itis(j)||z[i][n4].itis(j))
++u;
if(n==4&&u==0)
{
for(int i=0;i<9;++i)
if(z[m[0]][i].cal()!=1&&i!=n1&&i!=n2&&i!=n3&&i!=n4)
z[m[0]][i]=z[m[0]][i]-e;
for(int i=0;i<9;++i)
if(z[m[1]][i].cal()!=1&&i!=n1&&i!=n2&&i!=n3&&i!=n4)
z[m[1]][i]=z[m[1]][i]-e;
for(int i=0;i<9;++i)
if(z[m[2]][i].cal()!=1&&i!=n1&&i!=n2&&i!=n3&&i!=n4)
z[m[2]][i]=z[m[2]][i]-e;
for(int i=0;i<9;++i)
if(z[m[3]][i].cal()!=1&&i!=n1&&i!=n2&&i!=n3&&i!=n4)
z[m[3]][i]=z[m[3]][i]-e;
}
}
}
}
void solvecell(set z[][9])
{
int a1=0,b1=0,a2=0,b2=0;set e1,e2,e3,e4;int n=0;
for(int q=0;q<2;++q)
for(int x=0;x<9;++x)
for(int y=0;y<9;++y)
if(z[x][y].cal()!=1)
{
checkit(x,y,a1,b1,a2,b2,z);
if(z[x][y].cal()!=1)
{
e1=e2=e3=e4=0;n=0;
for(int j=a1;j<b1;++j)
if(j!=x)
for(int i=0;i<9;++i)
if(!(i>=a2&&i<b2))
{
if(n<3)
e1=e1+z[j][i];
if(n>2&&n<6)
e2=e2+z[j][i];
if(n>5&&n<9)
e3=e3+z[j][i];
if(n>8)
e4=e4+z[j][i];
++n;
}
z[x][y]=z[x][y]*(e1*e4+e2*e3);
}
if(z[x][y].cal()!=1)
{
e1=e2=e3=e4=0;n=0;
for(int j=a2;j<b2;++j)
if(j!=y)
for(int i=0;i<9;++i)
if(!(i>=a1&&i<b1))
{
if(n<3)
e1=e1+z[i][j];
if(n>2&&n<6)
e2=e2+z[i][j];
if(n>5&&n<9)
e3=e3+z[i][j];
if(n>8)
e4=e4+z[i][j];
++n;
}
z[x][y]=z[x][y]*(e1*e4+e2*e3);
}
}
}
bool isolve(set z[][9])
{
int y=0;
set r[9][9];
for(int i=0;i<9;++i)
for(int j=0;j<9;++j)
r[i][j]=z[i][j];
solved(r);
for(int i=0;i<2;++i){
solved1(r);
solved2(r);
solved3(r);
solved4(r);
solved5(r);
solved6(r);
//solved7(r);
solvecell(r);
Xwing2(r);
Xwing3(r);
//Xwing4(r);
}
for(int i=0;i<9;++i)
for (int j=0;j<9;++j)
if(r[i][j].cal()==1)
++y;
if(y==81)
return true;
return false;
}
void displayall()
{
for (int i=0;i<9;++i){
cout<<' ';
for (int j=0;j<9;++j){
if(cell[i][j].cal()!=1)
cout<<' '<<' ';
else
cout<<cell[i][j];
if(j==2||j==5)
cout<<'|'<<' ';
}
if(i==2||i==5)
{
cout<<endl<<' ';
for(int k=0;k<11;++k)
cout<<'-'<<' ';
}
cout<<endl;
}
cout<<endl;
}