• 高级软件工程第二次作业:随机生成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 项你认为对你特别重要的技能,记下目前的水平, 和你想在课程结束后达到的水平?

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

  • 相关阅读:
    PAT (Advanced Level) Practice 1055 The World's Richest (25 分) (结构体排序)
    PAT (Advanced Level) Practice 1036 Boys vs Girls (25 分)
    PAT (Advanced Level) Practice 1028 List Sorting (25 分) (自定义排序)
    PAT (Advanced Level) Practice 1035 Password (20 分)
    PAT (Advanced Level) Practice 1019 General Palindromic Number (20 分) (进制转换,回文数)
    PAT (Advanced Level) Practice 1120 Friend Numbers (20 分) (set)
    从零开始吧
    Python GUI编程(TKinter)(简易计算器)
    PAT 基础编程题目集 6-7 统计某类完全平方数 (20 分)
    PAT (Advanced Level) Practice 1152 Google Recruitment (20 分)
  • 原文地址:https://www.cnblogs.com/longjiangteng/p/9727250.html
Copyright © 2020-2023  润新知