C语言——求解数独(深搜)

来源:互联网 发布:pp手机助手mac版 编辑:程序博客网 时间:2024/06/07 13:11

数独游戏

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

数独游戏规则
在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每宫有九小格。
游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,
使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有一个唯一的解答(称为终盘)。

输入:

一个9*9的矩阵,0表示该位置是空白。

输出:

一个9*9的矩阵,格式与输入类似。

输入样例:

900050060020070100300102040703800529000345000516009403050208006007090010030010004

输出样例:

971453268428976135365182947743861529892345671516729483154238796687594312239617854



答案如下:

#include<stdio.h>
char shudu[9][9];
int a[9][9];
int m;
void search(int m);
void output();
int canplace(int m,int n);
int main()
{
 int i,j;
 for(i=0;i<9;i++)
 {
  for(j=0;j<9;j++)
  {
   scanf("%c",&shudu[i][j]);
   a[i][j]=shudu[i][j]-'0';
  }
  if(i!=8) scanf("\n");
 }
 search(0);
}
void search(int m)
{
 int i;
 if(m==81)
 {
  output();
 }
 else if(a[m/9][m%9]!=0)
 {
  search(m+1);
 }
 else if(a[m/9][m%9]==0)
 {
  for(i=1;i<=9;i++)
  {
   if(canplace(m,i))//尽管m是全局变量,仍需传到canplace里
   {
    a[m/9][m%9]=i;
        search(m+1);
       a[m/9][m%9]=0;
   }
  }
 }
}
int canplace(int m,int n)
{
 //一个函数不能有多处返回值。。真是蠢哭了
 int k,j,flag=1;
 for(j=0;j<9;j++)
 {
  if(n==a[m/9][j])
  {
   flag=0;
   break;
  }
 }
 if(flag==1)
 {
  for(j=0;j<9;j++)
     {
      if(n==a[j][m%9])
      {
       flag=0;
       break;
      }
     }
 }
    if(flag==1)
    {
     for(j=((m/9)/3)*3;j<((m/9)/3)*3+3;j++)
     {
       for(k=((m%9)/3)*3;k<((m%9)/3)*3+3;k++)
       {
         if(n==a[j][k])
         {
              flag=0;
              break;
         }
       }
       if(flag==0) break;
     }
    }
    return(flag);
}
void output()
{
 int i,j;
 for(i=0;i<9;i++)
 {
  for(j=0;j<9;j++)
  {
       printf("%d",a[i][j]);
  }
        printf("\n");
 }
}


原创粉丝点击