小算法练习,Sudoku(POJ2676数字游戏

本文介绍了一种解决Sudoku游戏的算法实现,通过递归回溯的方法填充9×9的表格,确保每行、每列及每个3×3宫格内的数字1至9各出现一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  SudokuPOJ2676)是一种简单的数字游戏,一个9×9的正方形表格被分成93×3的小正方形表格,在表格的某些单元格中,已填有数字19中的一个。游戏的任务是,在表格每一个空白单元格里填入数字19中的一个,使得9×9正方形表格的每一行和每一列以及93×3小正方形表格中,数字19都出现且仅出现一次。

你的任务是,编程求出给定Sudoku游戏的一种填法。

int array[9][9];
int num=0;
int pan(int i,int j,int t)
{
    int a,b;
    int i1,j1; 

     if(array[i][j]!=0)//原位置上有数
    {
        if(j==8&&i==8)
            return 1;
        if(j==8&&i<8)
           {
              for(a=1;a<=9;a++)
                if(pan(i+1,0,a)==1)
                   return 1;
           }
        else
         {
      for(a=1;a<=9;a++)
        if(pan(i,j+1,a)==1)
         return 1;
         }
    }
 else
 {     
          for(a=0;a<9;a++)//看大行,大列中是否有数与t重合的
             if(t==array[i][a]||t==array[a][j])
               return 0;
    //小矩阵中有没有与t重合的
          {
            i1=i/3;
            i1=i1*3;
            j1=j/3;
            j1=j1*3;
            for(a=i1;a<i1+3;a++)
                for(b=j1;b<j1+3;b++)
                     {
                        if(array[a][b]==t)
                          return 0;
                      }
           }
    //t暂时可以添入该位置
          array[i][j]=t;
          if(j==8&&i==8)
              return 1;//最后一个数了,成功添数
          if(j==8&&i<8)
           {
                for(a=1;a<=9;a++)
                  if(pan(i+1,0,a)==1)
                   return 1;
               if(a==10)
                 {
                  array[i][j]=0;
                  return 0;
                  }
            }
        else 
          { 
               for(a=1;a<=9;a++)
                 if(pan(i,j+1,a)==1)
                   return 1;
              if(a==10)
                  {
                 array[i][j]=0;
                 return 0;
               }
             } 
   
 }
}
void main()
{
   int i=0,j=0,t;
   for(i=0;i<9;i++)
   for(j=0;j<9;j++)
     array[i][j]=0;//初始化,全为0 ,此简化了,在原来方格中没有添数字

   for(t=1;t<=9;t++)//添第一个数
     if(pan(0,0,t)==1)
      break;
   for(i=0;i<9;i++)
    {

        for(j=0;j<9;j++)
           printf("%4d",array[i][j]);
         printf("\n");
    } 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值