题意是完成数独。

记录全图,将待填位置处填 0,记录下所有的待填位置,初始化结束。在每个待填位置处尝试填入 1 - 9,若经过判断后该位置可以填入某数字,则继续向下填下一个位置,

回溯时把待填位置重新赋值为 0,总之就是深搜的思想。

要注意存数时是从 0 位置存到 8 位置,而不是从 1 位置存到 9 位置,因为这样在后面判断是否满足 3*3 的小九宫格要求时可以直接用坐标乘以 3 再除以 3 的方法到达小九

宫格的左上角位置,便于遍历小九宫格。

代码如下:

 #include <bits/stdc++.h>
using namespace std;
char c;
int cnt,cur,cas,f,mp[][];
struct node
{
int x,y;
}q[]; bool judge(int n,int cur)
{
for(int i = ; i < ; ++i)
{
if(mp[q[cur].x][i] == n || mp[i][q[cur].y] == n)
return false;
}
int x = q[cur].x/*;
int y = q[cur].y/*;
for(int i = ; i < ; ++i)
for(int j = ; j < ; ++j)
{
if(mp[x+i][y+j] == n)
return false;
}
return true;
} void out()
{
for(int i = ; i < ; ++i)
{
for(int j = ; j < ; ++j)
{
if(j) printf(" ");
printf("%d",mp[i][j]);
}
puts("");
}
} void dfs(int cur)
{
if(cur == cnt)
{
out();
f = ;
}
else
{
for(int i = ; i <= &&!f; ++i)
{
if(judge(i,cur))
{
mp[q[cur].x][q[cur].y] = i;
dfs(cur+);
mp[q[cur].x][q[cur].y] = ;
}
}
}
}
int main()
{
while(cin >> c)
{
cnt = ;
if(c=='?')
{
q[cnt].x = ;
q[cnt++].y = ;
mp[][] = ;
}
else mp[][] = c-'';
for(int i = ; i < ; ++i)
{
cin >> c;
if(c=='?')
{
q[cnt].x = ;
q[cnt++].y = i;
mp[][i] = ;
}
else mp[][i] = c-'';
}
for(int i = ; i < ; ++i)
for(int j = ; j < ; ++j)
{
cin >> c;
if(c=='?')
{
q[cnt].x = i;
q[cnt++].y = j;
mp[i][j] = ;
}
else mp[i][j] = c-'';
}
f = ;
if(cas++) puts("");
dfs(); }
return ;
}

对于九宫格问题还可以用舞蹈链的方法,但水平有限,没有掌握...... 有兴趣者请移步:https://www.cnblogs.com/grenet/p/3163550.html

HDU 1426(数独 DFS)的更多相关文章

  1. P - Sudoku Killer HDU - 1426(dfs + map统计数据)

    P - Sudoku Killer HDU - 1426 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为 ...

  2. hdu 1426 Sudoku Killer (dfs)

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

  3. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  4. HDU 1426 Sudoku Killer(dfs 解数独)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1426 Sudoku Killer Time Limit: 2000/1000 MS (Java/Oth ...

  5. hdu 1426:Sudoku Killer(DFS深搜,进阶题目,求数独的解)

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

  6. HDU 1426 Sudoku Killer【DFS 数独】

    自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品— ...

  7. hdu 1426(DFS+坑爹的输入输出)

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

  8. HDU 1426 dancing links解决数独问题

    题目大意: 这是一个最简单的数独填充题目,题目保证只能产生一种数独,所以这里的初始9宫格较为稠密,可以直接dfs也没有问题 但最近练习dancing links,这类数据结构解决数独无疑效率会高很多 ...

  9. HDU 1426 Sudoku Killer(搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1426 题意很明确,让你解一个9*9的数独. DFS即可. #include <cstdio> ...

随机推荐

  1. Python基础——5模块

    使用模块 ‘the first line is zhushi’ _author_ = ‘syz’ import sys def test(): args = sys.argv if len(args) ...

  2. 事务的ACID属性,图解并发事务带来问题以及事务的隔离级别

    事务的概述 事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组 ...

  3. SQL MID() 函数

    MID() 函数 MID 函数用于从文本字段中提取字符. SQL MID() 语法 SELECT MID(column_name,start[,length]) FROM table_name 参数 ...

  4. C# — 实现软件开机自启功能(不需要管理员权限)

    因为最近项目需要,昨晚花了2个小时的时间,在网上搜索资料,通过C#实现了程序开机自启的功能,思路是:将软件的快捷方式创建到计算机的自动启动目录下就行了. 1.新建一个控制台项目:AutoStart 2 ...

  5. 迷茫<第三篇:再到北京>

    这是2016年初春,三月的北京仍带着丝丝的冷意,我再次来到了这座熟悉又陌生的城市.我是早上6点钟到的北京西站,坐火车过来的,一夜未眠,眼睛很疲劳.这次过来和上次回长沙一样,下了火车先把行李寄存在朋友家 ...

  6. C# FileSystemWatcher 并发

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  7. FM算法解析及Python实现

    1. 什么是FM? FM即Factor Machine,因子分解机. 2. 为什么需要FM? 1.特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信 ...

  8. 微信JSSDK使用步骤(用于在微信浏览器中自定义分享,分享到朋友圈,拍照,扫一扫等功能)

    一.使用JSSDK需要一个公众号(需要认证!): (1).把自己项目的服务器地址输入. (2).把MP_verify_m7Qp93BAuIGDWRVO.txt  文件下载下来,放到该服务器域名指向的根 ...

  9. 常用vim命令

    一.Vim编辑器的常用命令 在Linux下毫无疑问vim编辑器是非常好用的 因为平时有用到,有些东西不常用就会忘记,特记录下自己一些常用的   1.1.2 命令模式转换为编辑模式 i: 在当前光标所在 ...

  10. Flask 微信公众号开发

    公众号接口 1. 公众号消息会话 目前公众号内主要有这样几类消息服务的类型,分别用于不同的场景. 群发消息 公众号可以以一定频次(订阅号为每天1次,服务号为每月4次),向用户群发消息,包括文字消息.图 ...