我的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数组的大小取余。。。