软件工程实践第二次作业--个人项目实战
我的GitHub项目地址
经过今天的努力,总算把第一个生成数独的版本做出来了。源码传到GitHub上了。。。但是居然不能创建文件夹,还要安装Git插件。。。昨天和今天的时间主要花在思考编码和调试上了。还久没写c++了,感觉有点生疏,所以第一个版本不能接受命令行参数,也不能将输出输出到文本。。。这就有点伤了,不过做项目就是这样,在不断晚上的过程中提升自己的能力,明天继续改代码。今天先说说思路,这个数独主要是每生成一个数就判断这个数能不能符合要求。现将判断的代码贴到下面:
bool judgePosition(vector<vector<int>> &a, int row, int col)
{
int val = a[row][col];
//首先判断行列是否满足要求
for (int i = 0; i < row; i++)
{
if (a[i][col] == val)
return false;
}
for (int j = 0; j < col; j++)
{
if (a[row][j] == val)
return false;
}
//接着判断小九宫格里是否满足要求,首先得算出需要判断的这个点所在九宫的位置
int temp1 = row / 3;
int row_begin = temp1 * 3;
int row_end = row_begin + 2;
int temp2 = col / 3;
int col_begin = temp2 * 3;
int col_end = col_begin + 2;
int i = row_begin, j = col_begin;
for (int k = 1; k <= 8; k++)
{
if (i == row&&j == col)
break;
else if (a[i][j] == val)
return false;
if (j == col_end)
{
j = col_begin;
i = i + 1;
}
else
{
j = j + 1;
}
}
return true;
}
该判断方法调用递归,个人感觉效率上很差。。。接下来要用效能分析进行改进。利用随机数来生成数字,使用的rand()和srand()函数参见该博客。下面就是生成数字的代码:
bool generator(vector<vector<int>> &a, int row, int col)
{
//利用vector容器
vector<int> generate;
for (int i = 1; i <= 9; i++)
generate.push_back(i);
//产生随机数下标,生成数独中该位置的随机数
while (!generate.empty())
{
int index = rand() % generate.size();
a[row][col] = generate[index];
generate.erase(generate.begin() + index);
if (judgePosition(a, row, col) == false)
continue;
if (row == 8 && col == 8)
{
return true;
}
int nextRow, nextCol;
if (col == 8)
{
nextRow = row + 1;
nextCol = 0;
}
else
{
nextRow = row;
nextCol = col + 1;
}
bool nextPoint = generator(a, nextRow, nextCol);
if (nextPoint)
return true;
}
if (generate.empty())
{
a[row][col] = -100;
return false;
}
}
一开始那个生成随机数的算式如下
这样会出现不能取到不重复数的情况:

但是内存好像每次都爆掉,产生数的generator函数每次都返回false,所以现改为直接对generate数组的大小取余。。。

浙公网安备 33010602011771号