您的位置:首页 > 编程语言 > C语言/C++

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

2017-11-14 08:20 246 查看

数独游戏

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

描述:

数独游戏规则

在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每宫有九小格。

游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,

使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有一个唯一的解答(称为终盘)。
输入:

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

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

900050060
020070100
300102040
703800529
000345000
516009403
050208006
007090010
030010004

输出样例:

971453268
428976135
365182947
743861529
892345671
516729483
154238796
687594312
239617854

答案如下:

#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");

 }

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 深搜