2024年1月19日,数独游戏怎么玩?

2024年1月19日,数独游戏怎么玩?

首页休闲益智天梨数独更新时间:2024-05-11

学习工控知识,就来工控小新

农历腊月初九 2024/1/ 19

往期推荐

2024年1月15日,每日一分钟学习C语言,学习路上不能停

2024年1月16日,每日一分钟学习C语言,学习路上不能停

每日一练

/ Daily Exercises

C语言题目:解数独

编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则:

1.数字 1-9 在每一行只能出现一次。

2.数字 1-9 在每一列只能出现一次。

3.数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出

现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用'.'表示。

题目分析

数独是一种经典的逻辑推理游戏。在这个问题中,我们需要编写一个C语言程序来解决数独问题。我们需要遵循以下规则:

  1. 1、数字1-9在每一行只能出现一次。
  2. 2、数字1-9在每一列只能出现一次。
  3. 3、数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。

数独部分空格内已填入了数字,空白格用'.'表示。

程序展示

解决数独问题的一个常见方法是使用回溯算法。回溯算法是一种试探性的算法,通过尝试各种可能的填充数字,然后检查是否满足数独的规则,如果满足则继续填充下一个空格,否则就撤销当前填充的数字,尝试下一个数字。

#include <stdio.h> #include <stdbool.h> #define N 9 // 数独的大小 // 打印数独的网格 void print_grid(int grid[N][N]) { int i, j; for (i = 0; i < N; i ) { for (j = 0; j < N; j ) { printf("%d ", grid[i][j]); } printf("\n"); } } // 检查在某一行中填入某个数字是否合法 bool is_row_safe(int grid[N][N], int row, int num) { int col; for (col = 0; col < N; col ) { if (grid[row][col] == num) { return false; // 如果在同一行中已经存在相同的数字,那么不合法 } } return true; // 否则合法 } // 检查在某一列中填入某个数字是否合法 bool is_col_safe(int grid[N][N], int col, int num) { int row; for (row = 0; row < N; row ) { if (grid[row][col] == num) { return false; // 如果在同一列中已经存在相同的数字,那么不合法 } } return true; // 否则合法 } // 检查在某一个3x3的小方格中填入某个数字是否合法 bool is_box_safe(int grid[N][N], int row, int col, int num) { int i, j; int start_row = row - row % 3; // 计算小方格的起始行 int start_col = col - col % 3; // 计算小方格的起始列 for (i = 0; i < 3; i ) { for (j = 0; j < 3; j ) { if (grid[start_row i][start_col j] == num) { return false; // 如果在同一个小方格中已经存在相同的数字,那么不合法 } } } return true; // 否则合法 } // 检查在某一个格子中填入某个数字是否合法 bool is_safe(int grid[N][N], int row, int col, int num) { return is_row_safe(grid, row, num) && is_col_safe(grid, col, num) && is_box_safe(grid, row, col, num); // 只有在同一行、同一列和同一个小方格中都没有相同的数字,才合法 } // 找到一个空白的格子,如果找到了,就把它的行和列的索引存储在row和col中,并返回true,否则返回false bool find_empty(int grid[N][N], int *row, int *col) { int i, j; for (i = 0; i < N; i ) { for (j = 0; j < N; j ) { if (grid[i][j] == 0) { // 用0表示空白的格子 *row = i; *col = j; return true; // 找到了一个空白的格子 } } } return false; // 没有找到空白的格子,说明数独已经填满了 } // 用回溯法解决数独问题,如果找到了一个解决方案,就返回true,否则返回false bool solve_sudoku(int grid[N][N]) { int row, col, num; if (!find_empty(grid, &row, &col)) { // 如果没有空白的格子,说明已经解决了数独问题 return true; } for (num = 1; num <= 9; num ) { // 尝试在空白的格子中填入1到9的数字 if (is_safe(grid, row, col, num)) { // 如果填入的数字合法,就继续递归地解决剩下的数独问题 grid[row][col] = num; // 填入数字 if (solve_sudoku(grid)) { // 递归地解决剩下的数独问题 return true; // 如果成功了,就返回true } grid[row][col] = 0; // 如果失败了,就回溯,把格子恢复为空白,换一个数字继续尝试 } } return false; // 如果所有的数字都尝试过了,还是没有成功,就返回false,说明没有解决方案 } // 主程序 int main() { // 一个数独的例子,用0表示空白的格子 int grid[N][N] = { {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} }; printf("原始的数独网格:\n"); print_grid(grid); // 打印原始的数独网格 if (solve_sudoku(grid)) { // 如果有解决方案,就打印解决方案 printf("解决后的数独网格:\n"); print_grid(grid); // 打印解决后的数独网格 } else { // 如果没有解决方案,就打印提示信息 printf("这个数独问题没有解决方案!\n"); } return 0; // 程序结束 }

程序测试

运行上述代码,在VC6.0的环境下,可以得到如下的输出:

这与题目给出的结果一致,说明我们的算法是正确的。

源代码获取

#软件下载通道#

我用夸克网盘分享了「20240117」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。

链接:https://pan.quark.cn/s/3d7a8d0e891b

(链接和提取码建议复制粘贴,手动输入容易出现错误)

#支持一下#

分享整理,测试发布不易 如果您方便的话可以帮忙点一下↓↓

谢谢大家!

下期题目

Z 字形变换

将一个给定字符串s根据给定的行数numRows,以从上往下、从左到右进行Z字形排列。

比如输入字符串为"PAYPALISHIRING"行数为3时,排列如下:

RHAN

A PLSIIG

上个R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s,int numRows):

示例 1:

输入:S="PAYPALISHIRING",numRows=3

输出:"PAHNAPLSIIGYIR"

示例 2:

输入:="PAYPALISHIRING",numRows=4

输出:"PINALSIGYAHRPI"

点赞加关注,学习不迷路

微信公众号|工控小新

EPLAN电气绘图、TIA博图基础 、CAD、C语言教学、单片机基础、三菱PLC ... 每日持续更新中



查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved