ZCMU-1597-TomCat的数独

2/10/2017来源:ASP.NET技巧人气:302

1597: TomCat的数独

Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 32  Solved: 17 [Submit][Status][Web Board]

Description

都说了TomCat是一只有文化的Cat你还不信。

很久很久以前TomCat就喜欢上了数独游戏。游戏规则是这样的,在一个9*9的矩阵里面每一行每一列都由1,2,3,4,5,6,7,8,9这9个数构成,而且每一个3*3的小矩阵里也由1,2,3,4,5,6,7,8,9这9 个数构成(如下图)。然而TomCat是一只学渣,所以…….你懂的

Input

第一行输入一个T,表示数据组数。

接下来输入9*9的矩阵,未知的单位用0表示。(数据保证有唯一结果)

Output

输出运行结果,格式如下

Sample Input

1 0 4 6 0 0 1 0 0 0 7 9 0 3 5 0 6 0 1 0 0 5 0 9 0 3 2 4 0 0 0 0 8 0 4 0 5 0 3 0 2 1 5 0 0 0 5 8 9 0 0 0 0 7 2 2 0 0 6 0 9 5 1 0 1 0 8 5 0 2 0 0 0 0 5 3 0 4 0 2 0 7

Sample Output

3 4 6 8 2 1 7 5 9 7 9 2 3 5 4 6 8 1 8 1 5 7 9 6 3 2 4 6 2 1 9 8 7 4 3 5 4 3 7 2 1 5 8 9 6 5 8 9 4 6 3 1 7 2 2 7 4 6 3 9 5 1 8 1 6 8 5 7 2 9 4 3 9 5 3 1 4 8 2 6 7

HINT

TomCat考虑可以把每一个格子的可能的数字和不可能的数字都列出来与每一行每一列和所在小矩阵进行比较得出结果。

【解析】

这道题要注意的是每一列每一行的的那9个数字都必须不一样还有就是在9*9的格子当中的每一个从头开始数的九个3*3的格子中的每一个数也要求不一样。这道题其实和八皇后问题很相似,这里的输入9*9的方格的时候0代表这个数没有确定,而如果非0则表示那个数不用动了,所以我们递归搜索下去就好了,还是感觉自己不行...不算难的题也想不到还要靠别人的提醒...

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[9][9];
int check(int x,int y,int k)
{
    int p,q,i,j;
    p=(x/3)*3;//表示是哪一个3*3的矩阵
    q=(y/3)*3;
    for(i=0;i<9;i++)
    {
        if(a[x][i]==k||a[i][y]==k)//判断那一列或者那一排当中有没有一样的
            return 0;
    }
    for(i=p;i<p+3;i++)
    {
        for(j=q;j<q+3;j++)
        {
            if(a[i][j]==k)//判断那个3*3的矩阵
                return 0;
        }
    }
    return 1;
}
void facs(int now)
{
    int p,q,i,j;
    p=now/9;
    q=now%9;
    if(now==81)
    {
        for(i=0;i<9;i++)
        {
            for(j=0;j<9;j++)
            {
                if(j==0)
                    PRintf("%d",a[i][j]);
                else
                    printf(" %d",a[i][j]);
            }
            printf("\n");
        }
        return;
    }
    if(a[p][q]!=0)
        facs(now+1);//表示这个数不能改了
    else
    {
        for(i=1;i<10;i++)
        {
            if(check(p,q,i))
            {
                a[p][q]=i;
                facs(now+1);
                a[p][q]=0;
            }
        }
    }
}
int main()
{
  int t,i,j;
  scanf("%d",&t);
  while(t--)
  {
      for(i=0;i<9;i++)
      {
          for(j=0;j<9;j++)
          {
              scanf("%d",&a[i][j]);
          }
      }
      facs(0);
  }
  return 0;
}