学习工控知识,就来工控小新
农历腊月初九 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语言程序来解决数独问题。我们需要遵循以下规则:
数独部分空格内已填入了数字,空白格用'.'表示。
程序展示
解决数独问题的一个常见方法是使用回溯算法。回溯算法是一种试探性的算法,通过尝试各种可能的填充数字,然后检查是否满足数独的规则,如果满足则继续填充下一个空格,否则就撤销当前填充的数字,尝试下一个数字。
#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