帮我用cpp写一个做数独的程序
时间: 2023-08-31 16:25:16 浏览: 118
### 回答1:
您好,我可以回答这个问题。以下是一个用 C++ 编写的数独程序示例:
#include <iostream>
using namespace std;
const int N = 9;
int board[N][N];
// 判断某个数字是否可以填入某个位置
bool isValid(int row, int col, int num) {
// 判断行和列是否有重复数字
for (int i = ; i < N; i++) {
if (board[row][i] == num || board[i][col] == num) {
return false;
}
}
// 判断 3x3 的小方格是否有重复数字
int r = row / 3 * 3, c = col / 3 * 3;
for (int i = r; i < r + 3; i++) {
for (int j = c; j < c + 3; j++) {
if (board[i][j] == num) {
return false;
}
}
}
return true;
}
// 递归求解数独
bool solve(int row, int col) {
if (row == N) {
return true; // 找到了一个解
}
if (col == N) {
return solve(row + 1, ); // 进入下一行
}
if (board[row][col] != ) {
return solve(row, col + 1); // 已经填过数字,进入下一列
}
for (int num = 1; num <= 9; num++) {
if (isValid(row, col, num)) {
board[row][col] = num; // 填入数字
if (solve(row, col + 1)) {
return true; // 找到了一个解
}
board[row][col] = ; // 回溯
}
}
return false; // 没有找到解
}
int main() {
// 输入数独初始状态
for (int i = ; i < N; i++) {
for (int j = ; j < N; j++) {
cin >> board[i][j];
}
}
// 求解数独
if (solve(, )) {
// 输出解
for (int i = ; i < N; i++) {
for (int j = ; j < N; j++) {
cout << board[i][j] << " ";
}
cout << endl;
}
} else {
cout << "No solution." << endl;
}
return ;
}
### 回答2:
当然可以帮您写一个用C++编写的数独程序。数独是一种逻辑游戏,您可以通过填写9x9的格子,使每一行、每一列和每一个3x3的区域都包含数字1到9,且不能重复。下面是一个简单的C++程序示例:
```cpp
#include <iostream>
using namespace std;
// 验证数字num是否可以放置在数独的特定位置(row, col)
bool isSafe(int grid[9][9], int row, int col, int num)
{
// 检查行和列
for (int i = 0; i < 9; i++) {
if (grid[row][i] == num || grid[i][col] == num)
return false;
}
// 检查所在的3x3区域
int startRow = row - row % 3;
int startCol = col - col % 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (grid[i + startRow][j + startCol] == num)
return false;
}
}
return true;
}
// 数独求解函数
bool solveSudoku(int grid[9][9])
{
int row, col;
// 检查数独是否已经解决
if (!findUnassignedLocation(grid, row, col))
return true; // 数独已解决
// 尝试放置数字
for (int num = 1; num <= 9; num++) {
if (isSafe(grid, row, col, num)) {
// 放置数字
grid[row][col] = num;
// 递归求解数独
if (solveSudoku(grid))
return true;
// 撤回选择
grid[row][col] = 0;
}
}
return false;
}
// 在数独中找到一个未分配的位置,如果所有位置都已分配,则返回false
bool findUnassignedLocation(int grid[9][9], int& row, int& col)
{
for (row = 0; row < 9; row++) {
for (col = 0; col < 9; col++) {
if (grid[row][col] == 0)
return true;
}
}
return false;
}
// 打印数独
void printGrid(int grid[9][9])
{
for (int row = 0; row < 9; row++) {
for (int col = 0; col < 9; col++) {
cout << grid[row][col] << " ";
}
cout << endl;
}
}
int main()
{
int grid[9][9] = {
{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}
};
if (solveSudoku(grid)) {
cout << "解决方案:" << endl;
printGrid(grid);
} else {
cout << "无解" << endl;
}
return 0;
}
```
这个程序使用了递归回溯的方法来求解数独问题。在主函数中,我们先定义一个9x9的数组来表示数独的初始状态,其中0表示未分配的位置。程序将会尝试逐个数字地填写空格,并通过递归来进一步求解,如果没有冲突,则递归执行下一个位置。如果找到解决方案,则打印输出结果,否则,输出无解。这个例子可以直接运行,并给出了一个数独问题的解决方案。
### 回答3:
当然可以帮您编写一个用C++语言实现的数独程序。
首先,数独是一个9x9的方格,需要在每个格子中填入1到9之间的数字,且每个数字在每一行、每一列和每个小的3x3的方框中都不能重复出现。
下面是一个简单的代码示例,用于生成并解决数独谜题:
```cpp
#include <iostream>
using namespace std;
const int SIZE = 9;
// 输出数独谜题
void printSudoku(int sudoku[SIZE][SIZE]) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
cout << sudoku[i][j] << " ";
}
cout << endl;
}
}
// 验证填入数字的合法性
bool isValid(int sudoku[SIZE][SIZE], int row, int col, int num) {
// 检查当前行是否存在相同数字
for (int i = 0; i < SIZE; i++) {
if (sudoku[row][i] == num) {
return false;
}
}
// 检查当前列是否存在相同数字
for (int i = 0; i < SIZE; i++) {
if (sudoku[i][col] == num) {
return false;
}
}
// 检查当前小的3x3方框中是否存在相同数字
int startRow = row - row % 3;
int startCol = col - col % 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (sudoku[startRow+i][startCol+j] == num) {
return false;
}
}
}
return true;
}
// 解决数独谜题
bool solveSudoku(int sudoku[SIZE][SIZE]) {
int row, col;
// 检查数独中是否存在未填数字的格子
// 若全填满则数独谜题解决
if (!findUnassignedCell(sudoku, row, col))
return true;
// 尝试填入数字
for (int num = 1; num <= SIZE; num++) {
// 验证填入数字是否合法
if (isValid(sudoku, row, col, num)) {
// 填入数字
sudoku[row][col] = num;
// 递归解决下一格
if (solveSudoku(sudoku))
return true;
// 若无解,则清空当前格子重新尝试
sudoku[row][col] = 0;
}
}
return false;
}
// 查找没有数字的格子
bool findUnassignedCell(int sudoku[SIZE][SIZE], int &row, int &col) {
for(row = 0; row < SIZE; row++)
for(col = 0; col < SIZE; col++)
if(sudoku[row][col] == 0)
return true;
return false;
}
int main() {
int sudoku[SIZE][SIZE] = {
{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}
};
if (solveSudoku(sudoku)) {
cout << "解决的数独谜题为:" << endl;
printSudoku(sudoku);
} else {
cout << "无解" << endl;
}
return 0;
}
```
此程序生成了一个简单的数独谜题,并将其求解。输出结果为解决后的数独谜题。您可以根据自己的需要修改初始数独终盘。希望这个程序对您有所帮助!