zoukankan      html  css  js  c++  java
  • 高级软件工程第二次作业:随机生成N个不重复的已解答完毕的数独棋盘

    #include <stdio.h> 
    #include "SuduCheck.h"
    int SuduCheck(int temp[9][9],int i,int j,int k)  //判断是否可以将第i行、第j列的数设为k
    {
         int m,n;
         //判断行
         for(n=0;n<9;n++)
         {
            if(temp[i][n]==k)
                return 0;               
         }
         //判断列
         for(m=0;m<9;m++)
         {
            if(temp[m][j]==k)
                return 0;
         }
        //判断所在小九宫格
        int t1=(i/3)*3,t2=(j/3)*3;
        for(m=t1;m<t1+3;m++)
        {
            for(n=t2;n<t2+3;n++)
            {
                 if(temp[m][n]==k)
                     return 0;
             }
         }
         //可行,返回true
         return 1;
    }
    SuduCheck()函数可以对数据进行判断,判断是否符合数独数列的规则。判断同一行有无从复数字,判断同一列有无从复数字,判断同一宫有无重复数字。
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include "SuduInput.h"
    #include "SuduCheck.h"
    #include "SuduGain.h"
    void cleanup(int temp[9][9])
    {
        int i,j;
        for(i=0;i<9;i++)
        {
            for(j=0;j<9;j++)
            {
                temp[i][j]=0;
            }
        }
    }
    
    int SuduGain(int temp[9][9])
    {
        int i,j,m,n,random=1;  //初始值第一个随机数是我学号最后一位,201810775001 
        //srand((unsigned)time(NULL));  //随机数据初始化
        for(i=0;i<9;i++)   //循环每一行 
        {
            for(j=0;j<9;j++)  //循环每一列 
            {
                m=0;
                while(SuduCheck(temp,i,j,random)==0)  //判断此随机数是否能够使用,如果能够使用跳出循环,否则继续循环 
                {
                    random=rand()%9+1;  //生成一个0-9的随机数
                    m++;
                    if(m>100)  //如果同一个位置循环100次失败,判断此数独行失败,返回从新开始 
                    {
                        return 0;//此数独数列失败,从新开始        
                    }
                }
                temp[i][j]=random;//此数已经通过检查,可以放入数组 
                //SuduInput(temp);
                //printf("m=%d  n=%d	random=%d
    ",m,n,random);
                //getch();
            }    
        }
        return 1;  //数独列表生成成功 
    } 
    SuduGain()函数形成数独数列,随机生成0-9任意数据,如果符合数独数列要求就加入数独数列之中。如果随机的数据100次都不符合要求,则判断此数独数列失败,否则就能够成功。
    #include <stdio.h>
    #include <stdlib.h> 
    #include "SuduInput.h"
    void SuduInput(int temp[9][9])
    {
        int i,j;
        FILE *fp;
         //数独输出到屏幕
        for(i=0;i<9;i++)  
        {
            for(j=0;j<9;j++)
            {
                printf("%d",temp[i][j]);    
            }
            printf("
    ");    
        }
        printf("
    ");
         //数独输出到文档 
        if((fp = fopen("sudotiku.txt", "a+")) == NULL)
        {
            printf("Can,t opent file!");
            exit(1);
        }
        for(i=0;i<9;i++)  
        {
            for(j=0;j<9;j++)
            {
                fprintf(fp,"%d ",temp[i][j]);    
            }
            fprintf(fp,"
    ");        
        }
        fprintf(fp,"
    ");  
        fclose(fp);
    }
    SuduInput()输出数独数列数组在屏幕上和sudotiku.txt文本当中。
    #include <stdio.h>
    #include <stdlib.h>
    #include "SuduInput.h"
    #include "SuduCheck.h"
    #include "SuduGain.h"
    int sudo[9][9]={0};
    int main(int argc, char *argv[]) 
    {
        int i,n;
        n=atof(argv[2]);  //输入需要数独数据个数
        for(i=0;i<n;i++)  //循环获得数独 
        {    
            do 
            {
                cleanup(sudo);  //清理数组 
            }while(SuduGain(sudo)==0);  //如果数独生成失败,返回结果为0,则清空sudo数组,继续再试直到成功 
            SuduInput(sudo); 
        }
        return 0;
    }

    main()函数中获得需要随机的数独个数,调用SuduGain()函数生成数独数列,如果成功就进行下一次生成,直到完全题目要求。

     使用C语言编译器编译生成对应的sudotiku.exe 。在window 命令中调用sudotiku.exe,输入sudotiku.exe -c 3 即可获得以下数据在同一目录下的sudotiku.txt文件当中。

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

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

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

    分析:程序能够正确的生成多个数独数列,完整加入.h文件代码在https://git.coding.net/longjiangteng/sudoti.git中可以查看。但是代码效率很低,使用生成方法过于简单,需要计算机大量的运算尝试。随机函数rand()并不能做到真随机,多次生成的数独数列会有重复。还是具有持续改进的余地。

    心得:使用C语言编写数独程序非常复杂,提高效率的算法我一直没有能够理解,这就是我遇到的问题。只能花费多个晚上使用了一个最笨的办法完成了作业,感到非常的惭愧。

    课外任务作业:

    你已经具备的专业知识、技能、能力有哪些?

    目前为止已经掌握一些技能和专业知识,熟悉使用C语言编程,了解掌握Python语言。熟悉单片机系统,底层硬件驱动。

    离成为一个合格的 IT专业毕业生,在专业知识、技能、能力上还差距哪些?

    合格专业的IT毕业生,对于代码量和算法需要掌握,特别是数据结构和算法等知识。还需要掌握一门熟练的高级语言,能够使用高级语言进行开发。

    请看这个技能调查表, 从表中抽取 5 - 7 项你认为对你特别重要的技能,记下目前的水平, 和你想在课程结束后达到的水平?

    技能调查表中的技能我觉得都挺重要,很多技能希望能够在学校系统的进行学习提高。现在是我自认为的水平,就看我以后的学习了!

  • 相关阅读:
    PHP.ini配置
    Ubuntu下启动/重启/停止apache服务器
    为 Ubuntu 上的 PHP 安装 APC,提升应用速度
    PHP文件上传并解决中文文件名乱码问题
    php目录结构
    PHP 服务器变量 $_SERVER
    PHP 编程的 5 个良好习惯
    PHP导入Excel和导出数据为Excel文件
    SharePoint 计算列公式(拷贝微软的SDK)
    SharePoint2010 文档评分(转)
  • 原文地址:https://www.cnblogs.com/longjiangteng/p/9727250.html
Copyright © 2011-2022 走看看