在[ ]1[ ]2[ ]3[ ]4[ ]5[ ]6[ ]7[ ]8[ ]9的方格中填上“+”“-”,如果可以使其代数和为n,就称数n是“可被表出的数“,比如1是可被表出的数,因为+1+2-3-4+5+

在这里插入图片描述
在这里插入图片描述

### ✅ 解题思路 本题要求我们解决一个**简化版独问题**,即: - 给定一个 9x9独棋盘,其中**只有一个格子是 0(表示未知)** - 要求找出这个 0 应该填什么字(只能是 1-9),使得: - **每一行没有重复字** - **每一列没有重复字** - 注意:本题不需要检查 3x3 的小方块! --- ### 🔍 问题分析 1. **定位 0 的位置**: - 遍历整个独,找到唯一的 `0` 所在的行和列(记为 `row`, `col`) 2. **尝试填入 1-9 中的每个字**: - 对于每个候选字 `num`: - 检查该字是否在 `row` 行中出现过 - 检查该字是否在 `col` 列中出现过 - 如果都没有出现,则是一个合法解 3. **如果有多个合法解,只输出一个即可** - 如果没有合法解,输出 `NO` --- ### ✅ C语言实现代码 ```c #include <stdio.h> // 检查某行是否已有该字 int inRow(int board[9][9], int row, int num) { for (int j = 0; j < 9; j++) { if (board[row][j] == num) return 1; } return 0; } // 检查某列是否已有该字 int inCol(int board[9][9], int col, int num) { for (int i = 0; i < 9; i++) { if (board[i][col] == num) return 1; } return 0; } int main() { int board[9][9]; int row = -1, col = -1; // 读取输入并找到 0 的位置 for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { scanf("%d", &board[i][j]); if (board[i][j] == 0) { row = i; col = j; } } } // 尝试填入 1~9 for (int num = 1; num <= 9; num++) { if (!inRow(board, row, num) && !inCol(board, col, num)) { printf("%d\n", num); return 0; } } printf("NO\n"); return 0; } ``` --- ### 🔍 代码解释 - `inRow()` 和 `inCol()` 分别用于判断某行、某列是否已经包含某个- 主函中先读取输入,并记录唯一的 `0` 的位置 - 然后从 `1` 到 `9` 尝试填入,只要找到一个合法解就输出并退出 - 如果所有字都不能填,就输出 `NO` --- ### 📊 测试样例 #### 输入样例 1: ``` 1 4 9 8 3 6 7 5 2 5 7 6 2 4 1 9 3 8 2 3 8 5 7 9 1 6 4 7 2 4 3 6 8 5 9 1 6 8 3 9 1 5 4 2 7 9 5 1 4 2 7 3 8 6 3 6 2 7 9 4 8 1 5 4 1 5 6 8 3 2 7 9 8 9 7 1 5 2 0 4 3 ``` #### 输出: ``` 6 ``` --- #### 输入样例 2: ``` ...(略)最后一行是:8 9 7 1 5 2 0 4 4 ``` #### 输出: ``` NO ``` --- ### ✅ 总结 - 本题是一个典型的约束满足问题(Constraint Satisfaction) - 关键在于正确理解题目限制条件(仅需检查行和列) - 只有一个空格,所以不需要回溯,直接暴力枚举即可 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值