专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++

数独哪里错呢?解决方法

发布时间:2011-06-28 20:43:27 文章来源:www.iduyao.cn 采编人员:星星草
数独哪里错呢?
数独(Sudoku)是一项经久不衰的游戏,全世界有数量众多的数独fans,有不同的形式的数独,最广为流传的是9*9格的数独。
数独(游戏的规则很简单,有一张9*9的表格,每个表格中可填1-9之间的数字,但是在一行、一列或者一个3*3的小块内1-9之间的数字有且仅有出现一次。数独中的部分数字已经填好了,请你在最短的时间内按要求填好全部数字。
例如初始时如下:"."表示待填数字的空位置。
4 2 . 7 5 . 6 . .
3 8 6 . . . 5 . 1
. . . . 3 1 4 8 2
6 9 7 3 1 4 . . .
2 5 4 . . . 3 1 7
. . . 2 7 5 9 6 4
1 4 8 5 9 . . . .
5 . 9 . . . 8 4 6
. . 2 . 8 3 . 9 5
填好后,得到如下结果:
4 2 1 7 5 8 6 3 9
3 8 6 9 4 2 5 7 1
9 7 5 6 3 1 4 8 2
6 9 7 3 1 4 2 5 8
2 5 4 8 6 9 3 1 7
8 1 3 2 7 5 9 6 4
1 4 8 5 9 6 7 2 3
5 3 9 1 2 7 8 4 6
7 6 2 4 8 3 1 9 5

当然,现在的任务不是要你填表(这个任务有点复杂,我们留到以后吧!),而是假设这个表已经被别人填好了,请你编程帮助他判断一下这个表格是否满足填表条件。

Input
第一数字表示测试用例的个数n(n<=100)
对于每个测试用例,输入有9行9列矩阵。矩阵元素为1-9之间的数字。输入数据元素之间用空格分隔。
两个测试用例之间用空行分隔。

Output
对于每个测试用例,输出单独占一行,如果表格满足条件要求则输出1,否则输出0。

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

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

Sample Output
1
0

C/C++ code

#include<stdio.h>

main()
{
    int num[9][9],n,i,j,k,flag=0,u;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        for(j=0;j<9;j++)
        {
            for(k=0;k<9;k++)
            scanf("%d",&num[j][k]);
        }
        flag=1;
    for(j=0;j<9;j++)
    {
        for(k=0;k<8;k++)
          for(u=k+1;u<9;u++)
        if(num[j][k]==num[j][u])
        {
            flag=0;
        }
        if(j+1<9)
        if(num[j][0]==num[j+1][0])
        flag=0;
    }
    for(j=0;j<7;j+=3)
    {
        for(k=0;k<7;k+=3)
        {
            for(u=1;u<3;u++)
            {
            if(num[j][k+u]==num[j][k])
            flag=0;
            if(num[j+u][k]==num[j][k])
            flag=0;
            if(num[j+u][k+u]==num[j][k])
            flag=0;
            }
        }
    }
    printf("%dn",flag);
    }
}


哪里错呢?老是WA?

------解决方案--------------------
因为楼主只判断了行,没有判断列。。。程序有待改进啊。。。只发改进的地方
C/C++ code
        flag=1;
        for(j=0;j<9;j++)
        {
            flag=checkRowAndCol(num, j);
            if (flag==0)
            {
                break;
            }
        }

------解决方案--------------------
C/C++ code
#include<stdio.h>

main()
{
    int num[9][9],n,i,j,k,flag=0,u;
    int v,w,small[9];     //  为了简化3x3小格判断,我们需要一个辅助数组

    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        for(j=0;j<9;j++)
        {
            printf("Line%d-->",j+1);    //  输入这么多数字,还是稍微给人一点提示吧,否则很累啊
            for(k=0;k<9;k++)
                scanf("%d",&num[j][k]);
        }
        flag=1;
        for(j=0;j<9;j++)
        {
            for(k=0;k<8;k++)
              for(u=k+1;u<9;u++)
              {
                if(num[j][k]==num[j][u])
                {
                    flag=0;
                }
                if (num[k][j]==num[u][j])   //  判定第j列是否有重复数字,只要把行和列下标互相交换就可以了。因为那是个正方形表格
                    flag=0;
              }
            /*if(j+1<9)     //  这个样子怎么能判断列重复呢?它们甚至才执行了仅仅9遍。
                if(num[j][0]==num[j+1][0])
                    flag=0;*/
        }
        for(j=0;j<7;j+=3)
        {
            for(k=0;k<7;k+=3)
            {
                /*for(u=1;u<3;u++)          //  这样仅仅把num[j][k]拿出来对比,也就仅仅核对了每个3x3格子的顶部那一个数据而已,漏多了
                {
                    if(num[j][k+u]==num[j][k])
                    flag=0;
                    if(num[j+u][k]==num[j][k])
                    flag=0;
                    if(num[j+u][k+u]==num[j][k])
                    flag=0;
                }*/
                for (u=0;u<3;u++)           //  我们首先把这个小矩阵里的数据放到small里
                    for (v=0;v<3;v++)
                        small[u*3+v]=num[j+u][k+v];
                for (u=0;u<8;u++)           //  然后就能方便的判定里面有没有重复数据了
                    for (v=u+1;v<9;v++)
                        if (small[u]==small[v])
                            flag=0;
            }
        }
        printf("%dn",flag);
    }
}
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: