-->Sudoku

直接中文

Descriptions:

Sudoku对数独非常感兴趣,今天他在书上看到了几道数独题: 
给定一个由3*3的方块分割而成的9*9的表格(如图),其中一些表格填有1-9的数字,其余的则为空白(数字0为空白)。请在空白表格中填入数字1-9使得9*9表格的每行、每列、每个3*3块内无重复数字。 


Input

第一行输入一个整数T,表示样例数量。对于每个样例, 一共9行, 表示数独表格的每一行。接下来每一行输入一个字符串表示数独表格的每一行的9个数字。数独表格中空白用数字0表示。


Output

对于每组样例,输出完整的数独表格,即数独表格的每一个空白都按规定填满数字。如果答案不唯一,输出任何一个答案就行。


Sample Input

1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107

Sample Output

143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127

提示可能会有多组解,输出其中一种即可。

题目链接:

https://vjudge.net/problem/POJ-2676

1~9 一个一个枚举

dfs试探,失败则回溯

用三个数组进行标记每行、每列、每个子网格已用的数字,用于剪枝

bool row[10][10];    //row[i][x]  标记在第i行中数字x是否出现了

bool col[10][10];    //col[j][y]  标记在第j列中数字y是否出现了

bool grid[10][10];   //grid[k][x] 标记在第k个3*3子格中数字z是否出现了

row 和 col的标记比较好处理,关键是找出grid子网格的序号与 行i列j的关系

即要知道第i行j列的数字是属于哪个子网格的

首先我们假设子网格的序号如下编排:

由于1<=i、j<=9,我们有: (其中“/”是C++中对整数的除法)

令a= i/3 , b= j/3  ,根据九宫格的 行列 与 子网格 的 关系,我们有:

不难发现 3a+b=k

即 3*(i/3)+j/3=k

又我在程序中使用的数组下标为 1~9,grid编号也为1~9

因此上面的关系式可变形为 3*((i-1)/3)+(j-1)/3+1=k
以上论述转自https://blog.csdn.net/lyy289065406/article/details/6647977

AC代码:

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 15
using namespace std;
int result;
int T,h,w;
int mp[Maxn][Maxn];//地图
bool row[Maxn][Maxn];//row[i][x] 标记在第i行中数字x是否出现了
bool col[Maxn][Maxn];//col[j][y] 标记在第j列中数字y是否出现了
bool grid[Maxn][Maxn];//grid[k][x] 标记在第k个3*3子格中数字z是否出现了
int dfs(int x,int y)
{
if(x==)
return ;
int f=;
if(mp[x][y])
{
if(y==)
f=dfs(x+,);
else
f=dfs(x,y+);
if(f)//回溯
return ;
else
return ;
}
else
{
int k=*((x-)/)+(y-)/+;
for(int i=; i<=; i++)//枚举1~9填空
if(!row[x][i]&&!col[y][i]&&!grid[k][i])
{
mp[x][y]=i;
row[x][i]=;
col[y][i]=;
grid[k][i]=;
if(y==)
f=dfs(x+,);
else
f=dfs(x,y+);
if(!f)//回溯,继续枚举
{
mp[x][y]=;
row[x][i]=;
col[y][i]=;
grid[k][i]=;
}
else
return ;
}
}
return ;
}
int main()
{
int h=w=;
cin>>T;
while(T--)
{
MEM(row,);
MEM(col,);
MEM(grid,);
for(int i=; i<=h; i++)
for(int j=; j<=w; j++)
{
char ch;//注意,这里一定要用char类型,不然读不进去
cin>>ch;
mp[i][j]=ch-'';
if(mp[i][j])
{
int k=*((i-)/)+(j-)/+;
row[i][mp[i][j]]=;
col[j][mp[i][j]]=;
grid[k][mp[i][j]]=;
}
}
//从(1,1)开始搜索
dfs(,);
//输出
for(int i=; i<=h; i++)
{
for(int j=; j<=w; j++)
cout<<mp[i][j];
cout<<endl;
}
}
}

【POJ - 2676】Sudoku(数独 dfs+回溯)的更多相关文章

  1. POJ 2676 Sudoku (数独 DFS)

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

  2. 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 ...

  3. POJ 2676 Sudoku (DFS)

    Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11694   Accepted: 5812   Special ...

  4. 深搜+回溯 POJ 2676 Sudoku

    POJ 2676 Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17627   Accepted: 8538 ...

  5. ACM : POJ 2676 SudoKu DFS - 数独

    SudoKu Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu POJ 2676 Descr ...

  6. P1074 靶形数独 dfs回溯法

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...

  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

    Sudoku Problem's Link:   http://poj.org/problem?id=2676 Mean: 略 analyse: 记录所有空位置,判断当前空位置是否可以填某个数,然后直 ...

  9. poj 2676 Sudoku ( dfs )

    dfs 用的还是不行啊,做题还是得看别人的博客!!! 题目:http://poj.org/problem?id=2676 题意:把一个9行9列的网格,再细分为9个3*3的子网格,要求每行.每列.每个子 ...

随机推荐

  1. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻(转)

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  2. css3 位置选择器 类似jq的:eq(0)

    JQ使用 :eq(位置),可以选择第几个元素 CSS3里面新增了一个用法,:nth-child(位置) 可实现和JQ同样的功能 需要注意的是jq第一个是从0开始,CSS的第一个是从1开始

  3. WPF 绑定到静态属性(4.5)

    1. 声明静态事件 /// <summary> /// 静态属性通知 /// </summary> public static event EventHandler<Pr ...

  4. NUGET源不存在,安装Nuget包提示“本地源不存在”

    困扰了两天的问题,终于找到原因了.因此来这里记录一下~ 前两天写项目时,要从NUGET上安装个第三方库,但不管是从可视化的管理器还是管理器控制台安装,都提示“本地源‘*******’不存在”.然后到网 ...

  5. 图像滤镜艺术---(Nostalgla Filter)老照片滤镜

    原文:图像滤镜艺术---(Nostalgla Filter)老照片滤镜 (Nostalgla Filter)老照片滤镜 Nostalgla Filter主要是通过算法来模拟一种复古,陈旧的照片风格,以 ...

  6. 指定Qt程序运行的style,比如fusion(以前没见过QStyleFactory)

    转载请注明文章:指定Qt程序运行的style,比如fusion 出处:多客博图 代码很简单,如下: #include <QtWidgets/QApplication>   #include ...

  7. 零元学Expression Blend 4 - Chapter 38 看如何使用Clip修出想要的完美曲线(下)

    原文:零元学Expression Blend 4 - Chapter 38 看如何使用Clip修出想要的完美曲线(下) 你可以把Clip想成是一个遮罩,运用遮罩达到我们想要的效果 所以在这里我们把文字 ...

  8. 轮廓追踪与C#实现

    原文:轮廓追踪与C#实现 轮廓追踪是图像处理中常见的方法,主要目的是追踪二值图像中目标物体的外轮廓,所得结果为单像素闭合轮廓. 流       程: 1. 确定种子点,即追踪的起始像素(如最左上方在轮 ...

  9. UWP访问KnownFolders.RemovableDevices时(读取U盘文件)抛出异常UnauthorizedAccessException

    读取U盘的文件时: StorageFile file = await folder.GetFileAsync("myfile.txt"); 抛出异常System.Unauthori ...

  10. WPF Build Action

    None: The file is not included in the project output group and is not compiled in the build process. ...