Sudoku
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 24081   Accepted: 11242   Special Judge

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 题意:就是普通的数独游戏,给出了初始状态的九宫格,让你打印出任意一种解法。
思路:这题用DFS来写。我们运用三个数组进行标记,从而得知每个格子可以放那些数,不可以放哪些数,然后dfs枚举即可。三个标记数组分别为line[][],column[][],block[][],
line:标记每一行哪些数已经被用了,哪些没被用;
column:标记每一列哪些数已经被用了,哪些没被用;
block:标记每一个3*3格子中哪些数被用过,哪些没被用;(判断某个格子为第几个块:3*3的块总共有三行和三列,假设格子索引从1-9,某个格子为第i行,第j列,可以知道它是(i-1)/3行的块,而且是(j-1)/3+1列的列,所以可以知道某个格子为第(i-1)/3*3+(j-1)/3+1块)
然后从第一个需要填数的格子开始,枚举1-9中可以填的所有数,然后将选中的数标记,继续下一个格子,若到达某个格子无数可选,则回溯。
具体看代码,最近在学Java,所以代码是用java写的,但语法基本和C++相同,所以不会java也能看懂。 代码:
 import java.util.Scanner;

 public class Main {
static boolean line[][]; //标记行的数组,一维的数字表示第几行,二维的数字表示这一行的哪一个数
static boolean column[][]; //标记列的数组
static boolean block[][]; //标记块的数组 public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int t = in.nextInt(); //输入t
while(t-- > 0)
{
line = new boolean[15][15]; //数组初始化
column = new boolean[15][15];
block = new boolean[15][15]; int map[][] = new int[15][15];
int all = 0; //all用来统计有多少个格子需要填数
for(int i=1; i<10; ++i) {
String s = in.next(); //输入字符串 for(int j=1; j<10; ++j) {
map[i][j] = s.charAt(j-1) - '0'; //将字符串转化为数字存入数组
if(map[i][j] == 0) all++; //统计 line[i][ map[i][j] ] = true; //标记每一个已经出现的数
column[j][ map[i][j] ] = true;
int xx = (i-1)/3*3 + (j-1)/3 + 1; //计算这个格子在第几个3*3的块中
block[xx][ map[i][j] ] = true;
}
} outer:for(int i=1; i<10; ++i) //找到第一个需要填的格子
for(int j=1; j<10; ++j) {
if(map[i][j] == 0)
{
DFS(i,j,all,map);
break outer; //跳出到循环外
}
} for(int i=1; i<10; ++i)
{
for(int j=1; j<10; ++j)
{
System.out.print(map[i][j]);
}
System.out.println();
}
}
in.close();
} static boolean DFS(int x,int y,int all,int[][] map) { if(all == 0) { //如果所有的格子都被填满,返回true
return true;
} int x1=0,y1=0;
outer:for(int i=x; i<10; ++i) //找到这个格子之后需要填数的第一个格子
for(int j=1; j<10; ++j)
{
if(i==x && j==y) continue; //跳过目前这个格子
if(map[i][j] == 0)
{
x1 = i;
y1 = j;
break outer;
}
} int xx = (x-1)/3*3 + (y-1)/3 + 1; //计算这个格子为第几个块
for(int k=1; k<10; ++k) {
if(!line[x][k] && !column[y][k] && !block[xx][k] ) //若这个数未被标记,表示可选
{
map[x][y] = k; //在这个格子存储这个数
line[x][k] = true; //将这个数标记
column[y][k] = true;
block[xx][k] = true; if(DFS(x1,y1,all-1,map)) //搜索下一个需要填数的格子
return true; line[x][k] = false; //能运行到这里,说明填数失败,所以回溯
column[y][k] = false;
block[xx][k] = false;
}
}
map[x][y] = 0; //若没有一个数满足要求,则回到上一个数,且要把这个数变回0;
return false;
}
}

POJ2676 – Sudoku(数独)—DFS的更多相关文章

  1. poj2676 Sudoku(DFS)

    做了很久还是参考了别人的答案orz,其实也不难啊.我要开始学一下怎么写搜索了... 题目链接:poj2676 Sudoku 题解:暴力搜索,DFS每个空白格子所放数字. #include<cst ...

  2. POJ 2676 Sudoku (数独 DFS)

      Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14368   Accepted: 7102   Special Judg ...

  3. POJ2676 Sudoku [数独]

    好题,也非常有用,犯了几个错误 1.在枚举赋值的时候,思维有个错误:当当前的赋值不能填完这个数独,应该是继续下一个循环,而不是return false 终止枚举 2.Generic Programin ...

  4. hdu 1426 Sudoku Killer (dfs)

    Sudoku Killer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  5. 【POJ - 2676】Sudoku(数独 dfs+回溯)

    -->Sudoku 直接中文 Descriptions: Sudoku对数独非常感兴趣,今天他在书上看到了几道数独题: 给定一个由3*3的方块分割而成的9*9的表格(如图),其中一些表格填有1- ...

  6. POJ Sudoku 数独填数 DFS

    题目链接:Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18105   Accepted: 8772   Sp ...

  7. POJ 2676 - Sudoku - [蓝桥杯 数独][DFS]

    题目链接:http://poj.org/problem?id=2676 Time Limit: 2000MS Memory Limit: 65536K Description Sudoku is a ...

  8. POJ - 2676 Sudoku 数独游戏 dfs神奇的反搜

    Sudoku Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smalle ...

  9. POJ2676 Sudoku(dfs)

    题目链接. 题目大意: 就是数独游戏.横竖,每一个9宫方块,必须有1~9,且不重复. 分析: 直接DFS.一开始在原图上搜,会TLE.把要补全的空格,放入数组,这样就不用遍历整个图寻找要填的空格了. ...

随机推荐

  1. 机房servlet过滤器

    1.源代码 loginform.html <html> <head> <title>使用过滤器改变请求编码</title> <meta http- ...

  2. 【Java】JVM(六)虚拟机字节码执行引擎

    一.概述 执行引擎是虚拟机中最核心的部分之一, 虚拟机自己实现引擎,自己定义指令集和执行引擎的结构体系. 二.栈帧 栈帧包含(1)局部变量表.(2)操作数栈.(3)动态链接.(4)方法返回地址.(5) ...

  3. IRanges package

    1)介绍 在分析序列时,我们通常对特定的连续子序列感兴趣. 例如,a矢量可以被认为是按字母顺序排列的小写字母序列. 我们将第一个五个字母(a到e)称为连续的子序列,而仅包含元音的子序列不会是连续的. ...

  4. KEGG数据库介绍

    转载自https://mp.weixin.qq.com/s/pqbMXMkuqEXbLf31PTxGZQ KEGG简介 KEGG 数据库于 1995 年由 Kanehisa Laboratories ...

  5. JDBC远程连接数据库

    使用jdbc远程连接数据库(非本地数据库)出现的问题可用的解决方法: 1.修改mysql配置文件 配置文件中注释掉 bind-address=127.0.0.1 2.修改数据库 登入mysql后,更改 ...

  6. clion register

    1. 使用 activation code 激活 安装完软件后,启动,在要求输入注册码的界面(菜单栏 ⇒ help ⇒ register)选择“License server”输入“http://ide ...

  7. Windows phone 自定义用户控件(UserControl)——ColorPicker

    编码前 学习Windows phone自定义用户控件,在<WPF编程宝典>学习的小例子.并根据windows phone稍微的不同,做了点修改.ColorPicker(颜色拾取器):拥有三 ...

  8. 虚拟机安装Centos6.5服务器系统

    前言: 工作需要,研究Linux数日,写下此教程,意在给其他初学者参考学习,亦是给自己留作备用.好记性不如烂笔头,毕竟只是偶尔使用,留下教程,以备不时之需. 对于学习研究Linux的新手,个人推荐VM ...

  9. 利用Google Chrome开发插件,在网页中植入js代码

    Google Chrome是一个很强大的浏览器,提供了各种各样的插件,大大提升了使用了的效率,比如vimium.honx等. Google在提供这些插件的同时还允许用户开发自己的插件. 最近在写js的 ...

  10. [leetcode]113. Path Sum II路径和(返回路径)

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...