【POJ - 2676】Sudoku(数独 dfs+回溯)
-->Sudoku
直接中文
Descriptions:
给定一个由3*3的方块分割而成的9*9的表格(如图),其中一些表格填有1-9的数字,其余的则为空白(数字0为空白)。请在空白表格中填入数字1-9使得9*9表格的每行、每列、每个3*3块内无重复数字。
Input
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+回溯)的更多相关文章
- POJ 2676 Sudoku (数独 DFS)
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14368 Accepted: 7102 Special Judg ...
- 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 ...
- POJ 2676 Sudoku (DFS)
Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11694 Accepted: 5812 Special ...
- 深搜+回溯 POJ 2676 Sudoku
POJ 2676 Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17627 Accepted: 8538 ...
- ACM : POJ 2676 SudoKu DFS - 数独
SudoKu Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu POJ 2676 Descr ...
- P1074 靶形数独 dfs回溯法
题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...
- POJ 2676 - Sudoku - [蓝桥杯 数独][DFS]
题目链接:http://poj.org/problem?id=2676 Time Limit: 2000MS Memory Limit: 65536K Description Sudoku is a ...
- 搜索 --- 数独求解 POJ 2676 Sudoku
Sudoku Problem's Link: http://poj.org/problem?id=2676 Mean: 略 analyse: 记录所有空位置,判断当前空位置是否可以填某个数,然后直 ...
- poj 2676 Sudoku ( dfs )
dfs 用的还是不行啊,做题还是得看别人的博客!!! 题目:http://poj.org/problem?id=2676 题意:把一个9行9列的网格,再细分为9个3*3的子网格,要求每行.每列.每个子 ...
随机推荐
- Win8Metro(C#)数字图像处理--2.27图像加法运算
原文:Win8Metro(C#)数字图像处理--2.27图像加法运算 [函数名称] 图像加法函数AddProcess(WriteableBitmap src, WriteableBitmap a ...
- Android adb你真的会用吗?
前言 本文基于Android官方文档, 以及个人工作的使用经验, 总结下adb的常用用法, 备忘. 1.adb 简介 adb全名Andorid Debug Bridge. 顾名思义, 这是一个Debu ...
- QML中实现setTimeout和setInterval
Qt的QML中,js未提供setTimeout和setInterval,可以通过下面的代码实现. Timer {id: timer} function setTimeout(cb,delayTime) ...
- NUMA 架构
NUMA架构的CPU -- 你真的用好了么? - http://cenalulu.github.io/linux/numa/ SQL Server 如何支持 NUMA - https://docs.m ...
- jQuery实时聊天jquery-chat
jquery-chat是基于jQuery UI + Node.js + Socket.IO 实现100%纯JavaScript实时聊天(客户端和服务器都是JS),实现了facebook / Gmail ...
- xe5 for android 地理定位GPS
先上源码,在解释. implementation uses androidapi.jni.JavaTypes, androidapi.jni.Location, FMX.helpers.android ...
- dedecms自学
[dedecms笔记] index.htm 主页模板head.htm 列表头部模板footer.htm ...
- 移动端使用rem.js,解决rem.js 行内元素占位问题
父级元素: letter-spacing: -0.5em;font-size: 0; 子级元素: letter-spacing: normal; display: inline-block; vert ...
- Centos7 fstab盘符挂载硬盘导致重启系统失败解决办法
服务器拥有多个硬盘插槽,在进行维护或重启时,这些硬盘的相对位置可能发生变化.利用盘符(dev/vda)方式挂载磁盘,可能由于磁盘顺序变化导致重启时读取fstab文件发生错误,从而无法正常重启服务器. ...
- 基于maven的项目脚手架,一键创建项目的项目模板
制作基于maven的项目脚手架 Springboot的出现极大的简化了项目开发的配置,然而,到真实使用的时候还是会有一堆配置需要设定.比如依赖管理,各种插件,质量扫描配置,docker配置,持续集成配 ...