zoukankan      html  css  js  c++  java
  • 数独设计

    软件工程第二次作业

    1、github地址
    2、解题思路:

        在以前,没怎么接触过数独。刚看到这个题目的时候,有些懵。后面去百度,了解了它的规则,接着又去做了几个数独题目。参考了一些网上资料,最初的想法是在一个小九宫格里面进行行变化或者列变化,这样就不会影响其他的小九宫格。后面觉得这样实现有些复杂。干脆第一行先排列,再去判断下一个数能否填入。要求是行、列、小九宫格里面不会有重复的数字出现。后面和同学讨论了后,由于原来判断填入的下一个数是从小到大进行判断,所以后面将其改为随机生成一个数,进行填入,可能性会变多。
    

    3、设计实现:
    代码中运用了三个函数(初始化函数、判断函数、主函数),核心是判断函数。

    4、代码显示:
    头文件:

    include "stdafx.h"

    include "cstdlib"

    include "time.h"

    include "algorithm"

    include "iostream"

    include "fstream"

    判断函数:

    bool judge(int i, int j)
      {
    if (i > 9 || j > 9)
    	return true;
    for(int k=1;k<=9;k++)
    {
    	
    	bool can = true;
    	for(int m =1;m<i;++m)
    		if (sodu[m][j] == k)
    		{
    			can = false;
    			break;
    		}
    	if (can)
    	{
    		for(int n=1;n<j;++n)
    			if (sodu[i][n] == k )
    			{
    				can = false;
    				break;
    			}
    	}
    	if (can)
    	{
    		int x = (i / 3) * 3 + 3;
    		int y = (j / 3) * 3 + 3;
    		if (i % 3 == 0)
    		{
    			x = i;
    		}
    		if (j % 3 == 0)
    		{
    			y = j;
    
    		}
    		for (int p = x - 2; p <= x; ++p)  // 检查在3×3的小方格中是否出现了同一个数字
    		{
    			if (can == false)   //跳出外层循环 
    				break;
    			for (int q = y- 2; q <= y; ++q)
    				if (sodu[p][q] == k)
    				{
    					can = false;
    					break;
    				}
    		}
    	}
    	if (can)
    	{
    		sodu[i][j] = k;
    		if (j<9)
    		{
    			if (judge(i, j + 1))  //到同一行的下一位置开始搜索 
    				return true;
    		}
    		else
    		{
    			if (i < 9)
    			{
    				if (judge(i + 1, 1))   // 到下一行的第一个空格开始搜索
    					return true;
    			}
    			else
    				return true;  //i >= 9  && j >= 9  , 搜索结束 
    
    		}
    		sodu[i][j] = 0;   //关键这一步:找不到解就要回复原状,否则会对下面的搜索造成影响 
    	}
    }
    return false;  //1到9都尝试过都不行,则返回递归的上一步 
    
    
    }
    

    初始化函数:

    void init(void)
     {
    for (i = 1; i < 10; i++)
    {
    	for ( j = 1; j < 10; j++)
    		sodu[i][j] = 0;
    }                                  // 初始化
    for (int i = 1; i <= 9; i++)
    {
    	sodu[1][i] = i;
        }
    sodu[1][1] = num;
    sodu[1][num] = 1;      //按要求固定第一个数,然后该数为序号对应的数与其交换
    random_shuffle(&(sodu[1][2]), &(sodu[1][10]));   //第一个数固定,后八位随机排列
        judge(2, 1);      //从第二行第一个数开始判断
    }
    

    主函数(输出函数):

     int main()
    {
    ofstream fout("soduku.txt");      //按要求输出.txt文件
    cin >> N;
    for (int w = 0; w < N; w++)
    {
    	init();
        for (int i = 1; i <= 9; i++)
        {
    	      for (int j = 1; j <= 9; j++)
    		  fout << sodu[i][j] << " ";
    	      fout << endl;
     }
        fout << endl;
    }
    fout << flush;
    fout.close();
    return 0;
    

    }
    5:、函数关系:

    6、实验结果:

    7、性能分析:


    性能分析后,发现自己的代码程序跑的很慢。然后将其输出函数改为以下(快了一点点):

     freopen("soduku.txt", "w", stdout);
    N = 100000;
    for (int w = 0; w < N; w++)
    {
    	init();
        for (int i = 1; i <= 9; i++)
        {
    	      for (int j = 1; j <= 9; j++)
    		  printf("%d ",sodu[i][j]);
    		  putchar('
    ');
    	}
    
    	putchar('
    ');
      }
    

    8、PSP表格(感觉自己做的时候没有按照这些步骤来):

    9、实践总结:

        这次实践,让我感受到了很大的压力。很多都是刚接触的新软件,新的IDE,一时没有很好的适应下来。熟悉软件的过程中经常出错,而且一出错不知道怎么返回上一步,只好从头再来。还有就是编码的过程,让我体会到和同学一起讨论的乐趣,慢慢的收获越来越多,虽然最后的代码不是很好,但对自己来说也算是一个小小的进步了。继续加油。
  • 相关阅读:
    gulp serve 报错 gulp.ps1
    Jquery选择器
    Jquery动画
    js 雪花
    h5 偏门小方法
    HTML基础
    HTML5介绍
    JavaScript String 简易版烟花
    JavaScript Select和Option列表元素上下左右移动
    H5缓存-Manifest
  • 原文地址:https://www.cnblogs.com/wwgsdh/p/7500997.html
Copyright © 2011-2022 走看看