4X4宫格

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值