数独设计

软件工程第二次作业

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:、函数关系:
1225824-20170910194154210-719117595.png

6、实验结果:
1225824-20170910152138757-811888122.png
7、性能分析:
1225824-20170910202426163-976709751.png
1225824-20170910202452272-801113483.png
1225824-20170910202517147-649622176.png

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

 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('\n');
    }

    putchar('\n');
  }

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

9、实践总结:

    这次实践,让我感受到了很大的压力。很多都是刚接触的新软件,新的IDE,一时没有很好的适应下来。熟悉软件的过程中经常出错,而且一出错不知道怎么返回上一步,只好从头再来。还有就是编码的过程,让我体会到和同学一起讨论的乐趣,慢慢的收获越来越多,虽然最后的代码不是很好,但对自己来说也算是一个小小的进步了。继续加油。

转载于:https://www.cnblogs.com/wwgsdh/p/7500997.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值