哭吧!喜欢玩数独游戏的亲们!你被取代了——C语言解数独

来源:互联网 发布:淘宝转化率25%算正常吗 编辑:程序博客网 时间:2024/05/17 22:21

当时大学新买的Nokia手机上有这个游戏,玩着玩着突然想能不能写个程序来解题,因为当时在学C语言,于是乎……
原文在QQ空间,现在整理到CSDN上供大家吐槽

先上代码

#include<stdio.h>#include<conio.h>int str[9][9];void output();void main(){    //定义    int i,j,k,num,flag=0,count=0;    int control=0,con=0;    int cishu=0;    //输入    printf("请输入81个数,空位用“0”代替:\n");    for(i=0;i<9;i++)    {        for(j=0;j<9;j++)        {            scanf("%1d",&str[i][j]);        }    }    //处理    while(con==0)    {        con=1;        for(i=0;i<9;i++)        {                   for(j=0;j<9;j++)            {                               if(str[i][j]==0)                {                    //////////////////////////////////////////////////////////////////////////                    //试值开始                    for(num=1;num<=9;num++)                    {                                                       flag=0;                                                                         //不同于九格                        if(i%3==0&&j%3==0)                        {                            if(num!=str[i][j+1]&&num!=str[i][j+2]&&num!=str[i+1][j]&&num!=str[i+1][j+1]&&num!=str[i+1][j+2]&&num!=str[i+2][j]&&num!=str[i+2][j+1]&&num!=str[i+2][j+2])                            {                                flag=1;                            }                        }                        else if(i%3==0&&j%3==1)                        {                            if(num!=str[i][j+1]&&num!=str[i][j-1]&&num!=str[i+1][j]&&num!=str[i+1][j+1]&&num!=str[i+1][j-1]&&num!=str[i+2][j]&&num!=str[i+2][j+1]&&num!=str[i+2][j-1])                            {                                flag=1;                            }                        }                        else if(i%3==0&&j%3==2)                        {                            if(num!=str[i][j-2]&&num!=str[i][j-1]&&num!=str[i+1][j]&&num!=str[i+1][j-2]&&num!=str[i+1][j-1]&&num!=str[i+2][j]&&num!=str[i+2][j-2]&&num!=str[i+2][j-1])                            {                                flag=1;                            }                        }                        else if(i%3==1&&j%3==0)                        {                            if(num!=str[i][j+1]&&num!=str[i][j+2]&&num!=str[i+1][j]&&num!=str[i+1][j+1]&&num!=str[i+1][j+2]&&num!=str[i-1][j]&&num!=str[i-1][j+1]&&num!=str[i-1][j+2])                            {                                flag=1;                            }                        }                        else if(i%3==1&&j%3==1)                        {                            if(num!=str[i][j+1]&&num!=str[i][j-1]&&num!=str[i+1][j]&&num!=str[i+1][j+1]&&num!=str[i+1][j-1]&&num!=str[i-1][j]&&num!=str[i-1][j+1]&&num!=str[i-1][j-1])                            {                                flag=1;                            }                        }                        else if(i%3==1&&j%3==2)                        {                            if(num!=str[i][j-2]&&num!=str[i][j-1]&&num!=str[i+1][j]&&num!=str[i+1][j-2]&&num!=str[i+1][j-1]&&num!=str[i-1][j]&&num!=str[i-1][j-2]&&num!=str[i-1][j-1])                            {                                flag=1;                            }                                   }                        else if(i%3==2&&j%3==0)                        {                            if(num!=str[i][j+1]&&num!=str[i][j+2]&&num!=str[i-2][j]&&num!=str[i-2][j+1]&&num!=str[i-2][j+2]&&num!=str[i-1][j]&&num!=str[i-1][j+1]&&num!=str[i-1][j+2])                            {                                flag=1;                            }                        }                        else if(i%3==2&&j%3==1)                        {                            if(num!=str[i][j+1]&&num!=str[i][j-1]&&num!=str[i-2][j]&&num!=str[i-2][j+1]&&num!=str[i-2][j-1]&&num!=str[i-1][j]&&num!=str[i-1][j+1]&&num!=str[i-1][j-1])                            {                                flag=1;                            }                        }                        else if(i%3==2&&j%3==2)                        {                            if(num!=str[i][j-2]&&num!=str[i][j-1]&&num!=str[i-2][j]&&num!=str[i-2][j-2]&&num!=str[i-2][j-1]&&num!=str[i-1][j]&&num!=str[i-1][j-2]&&num!=str[i-1][j-1])                            {                                flag=1;                            }                        }                        //不同与九格结束                        //不同于行列检测                        if(flag==1)                        {                                   //不同于行                            for(k=0;k<9;k++)                            {                                       if(k!=i)                                    if(num==str[k][j])                                                                          {                                                                           control=1;                                    }                            }                            //不同于列                            if(control==0)                                for(k=0;k<9;k++)                                {                                       if(k!=j)                                        if(num==str[i][k])                                        {                                            control=1;                                        }                                }                            //不同于行列结束                        }//不同于行列检测结束                        if((control==0)&&(flag==1))                        {                            str[i][j]=num;                            count++;                        }                        control=0;                                          }//试值结束                    if(count>1)                    {                        str[i][j]=0;                    }                    count=0;                }//if(str[i][j]==0)控制结束            }//每行中每列处理结束        }//每行处理结束        //检测是否全部赋值        for(i=0;i<9;i++)            for(j=0;j<9;j++)            {                if(str[i][j]==0)                {                    con=0;                }            }        //分次输出        printf("第%d次处理",++cishu);        output();    }//while(con)结束    //输出    output();    //结束    getch();}//main结束void output(){       int i,j;    printf("答案为:\n");    for(i=0;i<9;i++)    {        for(j=0;j<9;j++)        {            printf(" %d ",str[i][j]);        }        printf("\n");    }}

别骂街,毕竟当时大一……

思路

  1. 输入:有数写数,空写0
  2. 循环中以0为控制条件,如果a[i][j]==0进行操作。
    if(a[i][j]==0)
  3. 每行每列都不同
    a[i][j]!=a[i][m]&&a[i][j]!=a[m][j]
  4. 每九个数不同
    如果行号对三求余 且列号对三求余
  5. 如果一个位置被连续两次或以上赋值,归零
    用count++来控制
  6. 测试用数据
0 7 0 3 0 4 0 6 00 4 0 0 5 0 1 0 83 0 0 9 0 1 4 2 70 2 8 0 0 5 3 0 00 6 9 0 0 2 7 4 00 0 5 1 0 6 9 0 02 0 3 0 1 9 0 0 46 0 0 0 0 3 0 0 10 0 0 7 0 8 2 0 0
0 0
原创粉丝点击