POJ2676数独游戏题解

news/2024/11/15 1:20:03/
第三次才AC我好菜

一道“简单”的问题。

Description

Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure. In some of the cells are written decimal digits from 1 to 9. The other cells are empty. The goal is to fill the empty cells with decimal digits from 1 to 9, one digit per cell, in such way that in each row, in each column and in each marked 3x3 subsquare, all the digits from 1 to 9 to appear. Write a program to solve a given Sudoku-task.

Input

The input data will start with the number of the test cases. For each test case, 9 lines follow, corresponding to the rows of the table. On each line a string of exactly 9 decimal digits is given, corresponding to the cells in this line. If a cell is empty it is represented by 0.

Output

For each test case your program should print the solution in the same format as the input data. The empty cells have to be filled according to the rules. If solutions is not unique, then the program may print any one of them.

Sample Input

1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107

Sample Output

143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127

简单来讲就是给T个数独给我们,让我们求解。

思路

根其他深搜一样还是要有变量来存每一行,每一列,每一宫(每一个大格)
是否有数字一到九。
剩下的代码就很好写,只是长了一点。
最后附上求宫公式,点想(x,y)在第:

3 * ((i - 1) / 3) + (j - 1) / 3 + 1

宫。
在这里插入图片描述

AC代码

#include <iostream>
#include <cstring>using namespace std;int a[15][15];
int row[100][100], col[100][100], gird[100][100];bool dfs(int x, int y) {if (x == 10) return 1;bool flag = 0;cout << 1; //防抄袭if (a[x][y]) {if (y == 9)  {flag = dfs(x + 1, 1);} else {flag = dfs(x, y + 1);}return flag?1:0;} else {int k = 3 * ((x - 1) / 3) + 1 + ((y - 1) / 3); for (int i = 1; i <= 9; i++) {if (!row[x][i] && !col[y][i] && !gird[k][i]) {a[x][y] = i;row[x][i] = 1;col[y][i] = 1;gird[k][i] = 1;if (y == 9) {flag = dfs(x + 1, 1);} else {flag = dfs(x, y + 1);}if (!flag) {a[x][y] = 0;row[x][i] = 0;col[y][i] = 0;gird[k][i] = 0;} else return 1; }}}return 0;
}int main() {int T;cin >> T;while (T--) {memset(row, 0, sizeof(row));memset(col, 0, sizeof(col));memset(gird, 0, sizeof(gird));for (int i = 1; i <= 9; i++) {for (int j = 1; j <= 9; j++) {char tmp;cin >> tmp;  //用scanf("%1d", &a[i][j]) 也可以(邪门方法 )a[i][j] = tmp - '0';if (a[i][j]) {int k = 3 * ((i - 1) / 3) + (j - 1) / 3 + 1;row[i][a[i][j]] = 1;col[j][a[i][j]] = 1;gird[k][a[i][j]] = 1;}}}dfs(1, 1);for (int i = 1; i <= 9; i++) {for (int j = 1; j <= 9; j++) {cout << a[i][j];}cout << endl;}cout << endl;}return 0; //华丽结束
}

http://www.ppmy.cn/news/563450.html

相关文章

python解数独--世界最难数独2.3秒完成

“芬兰数学家因卡拉&#xff0c;花费3个月时间设计出了世界上迄今难度最大的数独游戏&#xff0c;而且它只有一个答案。因卡拉说只有思考能力最快、头脑最聪明的人才能破解这个游戏。”这是英国《每日邮报》2012年6月30日的一篇报道。看完这个新闻就对数独有点感兴趣了&#xf…

puzzle(0111)《数独》

目录 一&#xff0c;标准数独&#xff08;规则数独&#xff09; 1&#xff0c;规则 2&#xff0c;隐含规则 3&#xff0c;对称性 4&#xff0c;斜线数独 二&#xff0c;标准数独校验、求解 力扣 36. 有效的数独 POJ 3074 Sudoku POJ 2676 Sudoku HDU 1426 Sudoku Kil…

数独解题器强化版

经过实际测试&#xff0c;在解决高难度数独时&#xff0c;解题器的效果仍旧不理想&#xff0c;所以添加了数字提示功能。 另外添加了自定义数独数据功能。 MainWindow.xaml <Window x:Class"SudokuSolver.MainWindow"xmlns"http://schemas.microsoft.com/…

【开源】完美破解九宫格(数独)游戏

数独是一种比较费时费脑的游戏&#xff0c;一般难度的数独玩下来也得1个小时左右&#xff0c;本人是伪数独爱好者&#xff0c;碰到难点的数独需要花上若干个小时&#xff0c;于是偷懒写了一套破解程序&#xff0c;特拿出来分享&#xff0c;希望有人喜欢。 思路&#xff1a; 1、…

经典数独游戏+数独求解器—纯C语言实现

“心常乐数独小游戏”&#xff08;以下简称“本软件”&#xff09;是一款windows平台下的数独游戏软件。 本软件是开源、免费软件。 本软件使用纯C语言编写&#xff0c;MinGW编译&#xff0c;NSIS打包。 本软件主要特性如下&#xff1a; 支持“闯关模式”和“选关模式” 支…

python实现简易数独小游戏

起源 既然“数独”有一个字是“数”&#xff0c;人们也往往会联想到数学&#xff0c;那就不妨从大家都知道的数学家欧拉说起&#xff0c;但凡想了解数独历史的玩家在网络、书籍中搜索时&#xff0c;共同会提到的就是欧拉的“拉丁方块&#xff08;Latin square&#xff09;”。…

1.数独游戏(生成题目解唯一)

前几天在玩数独游戏的时候&#xff0c;产生了一个大胆的想法&#xff1a; 数独app上的题目都是现成的&#xff0c;干脆自己写一个可以随机生成数独的程序算了 一、需求提出&#xff1a; 1.随机生成数独题目&#xff0c;要求该题目有解&#xff08;有一个解最好&#xff09;&a…

(附代码)数独大作业【读取数独,解数独,生成唯一解数独(随机,特定形状,不同难度生成),玩数独】

注:未经同意不要转载。 上学期简单的做了一个数独程序&#xff0c;实现了一些功能&#xff0c;想简单的为大家提供的思路。 为了避免某些情况出现&#xff0c;具体代码暂时先不发了&#xff0c;有不太懂的地方可以评论提问啊。 下面是我的具体报告&#xff1a; 一&#xff…