POJ-2676 Sudoku(简单数独-dfs深搜)

2023-11-11

Sudoku

Time Limit: 2000MS Memory Limit: 65536K

题目链接http://poj.org/problem?id=2676

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


题目大意:给你一个未完成的数独,让你找到一个方案,用1-9填满整个数独,使得9 *9的方块里每行不重复,每列不重复,每个3 * 3小块中的数不重复

3个不重复,那么我们就定义3个维护的数组,row,c,s(分别为行,列,块),接下来就是dfs填数了。。。块的维护可能有点不太明白怎么写,但没关系,我们直接无脑判断就行了:

int block(int a,int b) {
	if (a<=3) {
		if (b<=3) return 1;      //第一块区域
		else if (b<=6) return 2;
		else return 3;
	} else if (a<=6) {
		if (b<=3) return 4;
		else if (b<=6) return 5;
		else return 6;
	} else {
		if (b<=3) return 7;
		else if (b<=6) return 8;
		else return 9;
	}
}

这样一来s[block(x,y)]就是它的块状区域了(x代表行,y代表列)。之后的填数就变成了普通的搜索了。代码具体如下:

#include <cstdio>
#include <cstring>
int row[10][10],c[10][10],s[10][10],phot[10][10],mark;
int block(int a,int b);
void dfs(int r,int cl);
int main() {
	int n;
	scanf ("%d",&n);
	while (n) {
		n--;
		mark=0;
		memset(row,0,sizeof(row));
		memset(c,0,sizeof(c));
		memset(s,0,sizeof(s));
		memset(phot,0,sizeof(phot));
		for (int i=1; i<=9; i++)
			for (int j=1; j<=9; j++) {
				int ch;
				ch=getchar();
				while (ch<'0' || ch>'9') ch=getchar();
				phot[i][j]=ch-'0';
				if (phot[i][j]) {
					row[i][phot[i][j]]=1;
					c[j][phot[i][j]]=1;
					s[block(i,j)][phot[i][j]]=1;
				}
			}
		dfs(1,1);
		for (int i=1; i<=9; i++) {
			for (int j=1; j<=9; j++)
				printf ("%d",phot[i][j]);
			printf ("\n");
		}
	}
	return 0;
}
int block(int a,int b) {
	if (a<=3) {
		if (b<=3) return 1;
		else if (b<=6) return 2;
		else return 3;
	} else if (a<=6) {
		if (b<=3) return 4;
		else if (b<=6) return 5;
		else return 6;
	} else {
		if (b<=3) return 7;
		else if (b<=6) return 8;
		else return 9;
	}
}
void dfs(int r,int cl) {
	if (cl>9) cl=1,r++;
	if (r>9) {
		mark=1;
		return;
	}
	if (mark) return;
	while (phot[r][cl]) {
		cl++;
		if (cl>9) dfs(r+1,1);
	}
	for (int j=1; j<=9; j++) {
		if (mark) return;
		else if (!phot[r][cl] && !row[r][j] && !c[cl][j] && !s[block(r,cl)][j]) {
			phot[r][cl]=j;
			row[r][j]=1;
			c[cl][j]=1;
			s[block(r,cl)][j]=1;
			dfs(r,cl+1);
			if (mark) return;       //找到一个解后直接返回,不用再回溯了,节约时间
			row[r][j]=0;
			c[cl][j]=0;
			s[block(r,cl)][j]=0;
			phot[r][cl]=0;
		} 
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POJ-2676 Sudoku(简单数独-dfs深搜) 的相关文章

  • 高德地图精确查找与定位RegeocodeQuery与GeocodeQuery

    根据输入的字符串精确查找位置 用GeocodeQuery查找坐标 然后根据获取到的坐标 用RegeocodeQuery查询地址 例子中用了两个页面 一个是显示地址信息及定位的页面 另一个是搜索页面 点击搜索结果返回显示页面 显示信息并定位
  • 图论(四)宽度优先搜索BFS

    宽度优先搜索 BFS Breadth First Search 是一个针对图和树的遍历算法 发明于上世纪50年代末60年代初 最初用于解决迷宫最短路径和网络路由等问题 对于下面的树而言 BFS方法首先从根节点1开始 其搜索节点顺序是1 2
  • 搜索优化剪枝策略

    状态剪枝 如果将搜索的状态看作结点 状态之间的转移看作边 搜索的过程就构建出了一棵 搜搜树 其实 这也是判定搜索题目的一个方法 所谓 剪枝 就是在搜索树上去掉一些枝杈不进行搜索 从而减少小时间消耗 搜索树的剪枝如下图所示 常用的思考策略 1
  • Project窗口

    窗口概述 在此视图中 可访问和管理属于项目的资源 以下 Project窗口也称为Project浏览器 Project浏览器的左侧面板将项目的文件夹结构显示为层级列表 通过单击从列表中选择文件夹时 文件夹内容将显示在右侧面板中 可单击小三角形
  • LETTERS

    http poj org problem id 1154 Description A single player game is played on a rectangular board divided in R rows and C c
  • Zipper

    http poj org problem id 2192 Description Given three strings you are to determine whether the third string can be formed
  • 搜索题目综合

    BFS 1 小X学游泳 题解 枚举每一个点作为连通块的起点 求得连通块大小 然后打擂台求最值即可 参考代码 include
  • Oil Deposits

    http poj org problem id 1562 Oil Deposits Description The GeoSurvComp geologic survey company is responsible for detecti
  • java编写es搜索程序

    开发环境 java8 springboot pom文件导入依赖
  • Lucene使用IK中文分词

    Lucene使用IK中文分词 环境 Lucene 6 x IKAnalyzer2012 u6 也可以通过Maven或Gradle构建工程测试和验证 对于Lucene的最新版本 需要找到IK Analyzer对应的兼容版 传送门 Lucene
  • POJ-2676 Sudoku(简单数独-dfs深搜)

    Sudoku Time Limit 2000MS Memory Limit 65536K 题目链接http poj org problem id 2676 Description Sudoku is a very simple task A
  • 体积

    题目描述 问题描述 给出 n 件物品 每件物品有一个体积 V i 求从中取出若干件物品能够组成的不同的体积和有多少种可能 输入格式 第 1 行 1 个正整数 表示 n 第 2 行 n 个正整数 表示 V i 每两个数之间用一个空格隔开 输出
  • 深度优先搜索详解 C++实现

    DFS 全文大概四千字左右 如果您初学DFS相信会对您会有很大的帮助 能力有限 很多术语不够专业 理解万岁 二叉树的深度优先搜索 二叉树的概念这里就不细谈了 使用数组来存储二叉树 根结点从1开始 方便计算 设父节点的下标为n 那么左儿子的下
  • [django项目] 利用elasticsearch实现搜索功能

    新闻搜索 I 搜索功能分析 本节我们来完成新闻搜索功能 首先让我们来思考一下 要做一个通过关键词搜索文章的功能 需要搜索哪些字段 以及使用什么技术方案呢 既然我们是准备做新闻博客网站 那我们就可以拿同类型网站的做一下对比 例如CSDN 简书
  • 简单的动态规划——装箱问题

    装箱问题 告诉你箱子的容积为多少 告诉你有N件物品和每一件物品的体积 问如何选择物品才能令箱子的剩余容积最小 搜索递归 include
  • ES学习——介绍

    前言 在了解Elasticsearch之前 我们应该先了解下 什么是搜索引擎 目前有哪些主流的搜索引擎 搜索引擎搜索的质量应该如何评价 简介 什么是ES es全称为Elasticsearch 是一个高度可扩展且开源的全文检索和分析引擎 它可
  • Everything使用攻略和技巧

    Everything使用技巧 www hi channel com出品本文为H4海畅智慧原创文章 未经允许不得进行商业盈利性转载 非盈利性商业转载请注明出处www hi channel com 1 Everything下载地址 http w
  • linux find 命令忽略某个或多个子目录的方法 【转】

    文章来源 linux find 命令忽略某个或多个子目录的方法 文章参考 使用find查找文件的时候怎么避开某个文件目录 在linux find 进行查找的时候 有时候需要忽略某些目录不查找 可以使用 prune 参数来进行过滤 但必须要注
  • POJ 2676 Sudoku 数独(dfs)

    POJ 2676 Sudoku 数独 dfs Sudoku is a very simple task A square table with 9 rows and 9 columns is divided to 9 smaller squ
  • Android WiFi开发教程(二)——WiFi的搜索和连接

    在上一篇中我们介绍了WiFi热点的创建和关闭 如果你还没阅读过 建议先阅读上一篇文章Android WiFi开发教程 一 WiFi热点的创建与关闭 本章节主要继续介绍WiFi的搜索和连接 WiFi的搜索 搜索wifi热点 private v

随机推荐

  • jquery父页面和子页面之间的取元素

    一 父页面得到iframe中子页面的元素 iframe1 contents find form1 html 二 子页面获取父页面的元素 父页面元素id parent document 转载于 https my oschina net u 1
  • 计算机科学与技术专业选题推荐

    同学们好 这里是海浪学长的毕设系列文章 对毕设有任何疑问都可以问学长哦 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难
  • MARS: Markov Molecular Sampling for Multi-Objective Drug Discovery

    本方法用于进行多目标的分子优化 原文链接在这 以下内容均为我自己的理解 如有理解不正确的地方欢迎大家斧正 整体方法 采样思路 将多个目标综合成一个score 也就是文中提到的公式 其中 的具体实现就是各个部分打分的求和 文章中选择了总共四个
  • java集成测试_到底什么是集成测试?

    你的问题其实要分两块儿来说 因为现在用的是手机所以先简要回答一二 不明白的话再补充 单元测试就是最小代码单元的针对性测试 可以是对象的一个属性 检查是否存在或值是否有效等等 也可以是一个函数或方法 检查其行为或输出是否如预期或者代码执行效能
  • 解析H264的SPS信息

    原文链接 在做音视频开发的时候 存在不解码视频帧的前提下需要获取视频宽高 帧率等信息 而H 264中的SPS数据可为我们提供这些相关的信息 在此之前 我们需要对一些协议和算法有一定的初步了解 后文中有完整的代码展示 H 264协议 我们在此
  • 分布式版本控制工具——git

    lt 1 gt 主页 我的代码爱吃辣 lt 2 gt 知识讲解 Linux git lt 3 gt 开发环境 Centos7 lt 4 gt 前言 git是一个开源的分布式版本控制系统 可以有效 高速地处理从很小到非常大的项目版本管理 也是
  • PRD 使用Pentaho Metadata Editor(PME)生成的metadata做数据源(5)

    使用Pentaho Metadata Editor PME 生成的metadata做数据源 Pentaho Report Designer PRD 可以支持多种数据源输入方式 Pentaho Metadata Editor作为自家平台中的一
  • GBDT去预测时序数据

    最近有一个需求 需要用到GBDT算法去实现对时序数据进行预测 回归任务 数据是从2011年1月到2020年4月份6个不同城市的房地产交易数据 由于在网上没有找到对应的基于时序数据来用GBDT算法的博客或者资料 我也去github上面找个 出
  • 组装数组对象

    1 创建数组let arryList 2 创建数组内的元素 JSON对象 let item 3 给元素赋值item value1 num1 item value2 num2 4 把元素放入数组arryList push item 5 多元素
  • linux中的9个权限位

    首先 我们通过linux的ls命令操作获得每个文件的权限 如下图 1 表示连接的文件数 admin 表示用户 admin表示用户所在的组 5572 表示文件大小 字节 Feb 20 11 43 表示最后修改日期 2 20 表示文件名 由上图
  • Python爬虫获取10页的图片、文本数据并传入linux上的mysql数据库中

    一 任务需求 爬取网址之家的网站排行信息 共获取6个指标 2张图片和4个文本字符串 观察发现每个网页共30个 一共需要爬取10页 并把图片存入PNG目录下 文本信息存入info txt文件中 最后上传到linux上的Mysql数据库中 二
  • SpringBoot+mybatisPlus + dynamic-datasource实现真正的动态切换数据源(附核心代码)

    文章目录 前言 创建主库 生成mapper等代码 定义新数据源 创建初始化runner类 创建Mybatis配置类 拦截器实现动态切换 前言 系统要调整为S A S S版实现多 租 户功能 首先想到的两个解决方案就是 1 通过表字段隔离租户
  • 大数据可视化界面截图(三)

    电商销售 购买力 舆情 集团数据 品牌电商
  • Vijava 学习笔记之(VirtualMachine 更改虚拟机系统磁盘大小)

    源代码 package com vmware client import com vmware util Session import com vmware vim25 import com vmware vim25 mo Created
  • Tomcat打破双亲委派

    复习复习JVM类加载机制 再谈谈 Tomcat 的类加载器如何打破 Java 的双亲委托机制 JVM 的类加载器 Java 的类加载 就是把字节码格式 class 文件加载到 JVM 的方法区 并在 JVM 的堆区建立一个java lang
  • 阿里云服务器使用记录

    阿里云服务器SSH连接 1 登录打开个人ECS实例 2 确认服务器密码 3 选择VNC连接登录 3 1 注意保存连接密码 或者修改为个人密码 3 2 登录修改文件 vim etc ssh sshd config PermitRootLogi
  • 区块链包含术语概念【27术语整理汇总】

    问题导读1 区块链包含哪些概念 2 什么是工作量证明 3 什么是共识机制 4 你认为哪些概念比较重要 区块链现在很多人都在学习 无论是看书籍 还是看视频 我们有时候并不是明白讲的是什么 比如工作量证明 共识机制等等 所以这里补充下概念 由于
  • 导读:生活中的设计模式——启程之前,请不要错过我

    为什么叫设计模式 什么是设计模式 设计模式与生活有什么联系 为什么要学设计模式 如何进行学习 为什么选择 Python 弥补市场空缺 大势所趋 Python 已然成风 简单的 Python 基础 Python 的特点 基本语法 常用容器 L
  • zabbix 监控硬件

    之前介绍的zabbix监控都是属于监控服务方面 现在介绍一下zabbix监控服务器硬件信息的 本文出自 吟 技术交流 博客http dl528888 blog 51cto com 2382721 1403893 之前介绍的zabbix监控都
  • POJ-2676 Sudoku(简单数独-dfs深搜)

    Sudoku Time Limit 2000MS Memory Limit 65536K 题目链接http poj org problem id 2676 Description Sudoku is a very simple task A