数独,很多人都玩过吧。如下图所示,在一个9x9的面板中,已经填入了一些数字。要求你将所有剩余的空格填充完整,保证每一行都是1-9,每一列也是1-9,粗线隔开的9个小九宫格里边也是1-9,每一行、每一列、每个九宫格内都不允许出现重复的数字。这也就是C语言中的回溯法。接下来就带大家了解一下如何使用C语言来进行有趣的编程之九宫格计算。
代码实现
#include <iostream> #include <ctime> using namespace std; int* getNextSpace (int board[][9],int rowStart, int colStart) { if (colStart > 8) { rowStart++; colStart = 0; } if (rowStart > 8) { return new int[] {-1}; } for (int j = colStart; j < 9; j++) { if (board[rowStart][j] == 0) { return new int[] {rowStart, j}; } } rowStart++; if (rowStart > 8) { return new int[] {-1}; } for (int i = rowStart; i < 9; i++) { for (int j = 0; j < 9; j++) { if (board[i][j] == 0) { return new int[] {i, j}; } } } return new int[] {-1}; } bool validateBoard (int board[][9] ,int i,int j, int k) { // 纵向检查 for (int m = 0; m < 9; m++) { if (board[m][j] == k) { return false; } } //横向检查 for (int n = 0; n < 9; n++) { if (board[i][n] == k) { return false; } } //九宫格检查 int p = i / 3 * 3; int q = j / 3 * 3; for (int x = p; x < p + 3; x++) for (int y = q; y < q + 3; y++) { if (board[x][y] == k) { return false; } } return true; } void printResult (int result[][9] ) { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { cout << result[i][j] << "\t"; } cout << endl; } } void solveShuDu (int board[][9], int i, int j) { //点代表空格,寻找下一个空格 int* next = getNextSpace(board, i, j); if (next[0] == -1) { //找到了其中一个结果,就打印出来 printResult(board); return; } int m = next[0]; int n = next[1]; //每个空格都有从1-9的取值机会 for (char k = 1; k <=9; k++) { //验证是否符合要求 if (validateBoard(board, m, n, k)) { board[m][n] = k; //进入下一层递归 solveShuDu(board, m, n + 1); //回溯时,置回空格 board[m][n] = 0; } } } int main() { int start = clock(); int board[][9] = { 3,0,6,4,5,1,8,7,9, 0,4,5,7,0,9,2,0,0, 7,0,9,2,0,0,1,4,5, 0,0,3,5,4,7,6,9,0, 0,0,0,0,9,0,0,1,2, 6,0,8,0,2,3,4,0,0, 5,0,1,0,0,2,9,6,4, 8,6,4,0,0,5,7,2,3, 9,7,2,3,6,4,0,8,0 }; solveShuDu(board, 0, 0); int end = clock(); cout <<"time:" << end - start << endl; return 0; }
以上就是“C语言可以进行哪些有趣的编程(c语言可以写什么有趣的程序)”的详细内容,想要了解更多C语言教程欢迎持续关注编程学习网
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/9411/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取