void printf4(int a[][4]) //输出
{
int br=0;
for(int i1=0;i1<4;i1++)
for(int j1=0;j1<4;j1++)
{ cout<<a[i1][j1]<<" ";
br++;
if(br%4==0)
cout<<endl;
}
}
void putin(int a[][4],int m,int n,int*row,int*how) //输入点
{
a[m][n]=1;
row[m]++;
how[n]++;
}
bool couldputin(int a[][4],int m,int n,int *row,int *how) //判断是否可以输入。
{
if((m<4)&&(n<4)&&(row[m]!=2)&&(how[n]!=2)&&(a[m][n]!=1))
return true;
else
return false;
}
//ip修改为传址,以便修改行标记
void set8(int a[][4],int * row,int* how,int& ip) //输入8个点,每行2个,每列2个,
{
// srand((unsigned)time(0));
if(ip>=4)
{
ip--;//ip==4时,说明第四行已经完成,现在ip处于第五行,需要减一回到上一行
printf4(a);
cout<<endl;
}
else
{
for(int i=0;i<3;i++)
{
if (couldputin(a,ip,i,row,how))
{
putin(a,ip,i,row,how);
for(int j=i+1;j<4;j++)
{
if (couldputin(a,ip,j,row,how))
{
putin(a,ip,j,row,how);
ip++;
set8(a,row,how,ip);
}
//第二个点输入完成之后,如果进入到这里,则说明已经完成一个4x4宫格,需要将此点重置,并将每行每列相应数值减一
if (a[ip][j]==1)
{
a[ip][j]=0;
row[ip]--;
how[j]--;
}
}
}
//此点以下遍历完成,理由同上
if (a[ip][i]==1)
{
a[ip][i]=0;
row[ip]--;
how[i]--;
}
}
//退出一行之前,将相应变量清空
for (int k = 0;k < 4; ++k)
{
if (a[ip][k] == 1)
{
a[ip][k] = 0;
row[ip]--;
how[k]--;
}
}
ip--;//进入上一行,重新遍历
}
}
int main()
{
int a[4][4];
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
a[i][j]=0;
int row[4]={0,0,0,0}; //行, 每行输入的个数,最多为2.
int how[4]={0,0,0,0}; //列 每列输入的个数,最多为2.
int ip=0;
set8(a,row,how,ip);
return 0;
}