dfs(0634-数独)

问题描述

数独是非常流行的益智游戏,把一个9x9的九宫格分成9个小的3x3的小九宫,如下图所示。在这个九宫格上,每个小格子可以填的数字为1,2,3,...,9。初始时,某些格子已经填好数字,剩余的一些则为空白,你的任务是把空白的数字都填上1,2,3,...,9数字的一个,使得表格上每一行、每一列、以及每一个小九宫均含有有1,2,3,...,9(显然每个数字在每行、每列和每个小九宫中都出现并且只能出现一次)。请你写一个程序解决数独问题。

输入

输入为9行,每行9个数字,其中0代表对应的小格子为空白的格子。

输出

输出为9行,每行9个有1,2,3,...,9构成的数字。即数独问题的解。

输入样列
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107
输出样例
143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127说一下思路吧,我是参考黄学长的~就是将每一行每一列每一个九宫格标记一下,然后dfs搜索,注意边界和搜索完要保持原先的状态即可~
#include<bits/stdc++.h>
#define Next(x,y) y==9 ? dfs(x+1,1) : dfs(x,y+1)
using namespace std;

int a[10][10],b[10][10];
bool l[10][10],r[10][10],s[10][10];
int Map[10][10];

int fill(int x,int y,int k)
{
	if(l[x][k]||r[y][k]||s[Map[x][y]][k]) return 0;
	b[x][y]=k;
	l[x][k]=r[y][k]=s[Map[x][y]][k]=1;
	return 1;
}

void del(int x,int y,int k)
{
	b[x][y]=0;
	l[x][k]=r[y][k]=s[Map[x][y]][k]=0;
}

void print()
{
	for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++)
			cout<<b[i][j]<<"";
			cout<<"\n";}
}

void dfs(int x,int y)
{
	if(x==10&&y==1)
	{
		print();exit(0);
	}
	if(b[x][y]) Next(x,y);
	else
	{
		for(int i=1;i<=9;i++)
		{
			if(fill(x,y,i))
			{
				Next(x,y);
				del(x,y,i);//搜过之后要删除
			}
		}
	}
}

void init()
{
	for(int i=1;i<=9;i++)
		for(int j=1;j<=9;j++)
			Map[i][j]=(i-1)/3*3+(j-1)/3+1;
}

int main()
{
	char str;
	init();
	/*for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++)
			cout<<Map[i][j]<<" ";
			cout<<"\n";}*/
	for(int i=1;i<=9;i++)
	{
		for(int j=1;j<=9;j++)
		{
			str=getchar();
			a[i][j]=str-‘0‘;
			if(a[i][j])
				fill(i,j,a[i][j]);
		}
		getchar();
	}
	dfs(1,1);
	/*for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++)
			cout<<s[i][j]<<" ";
			cout<<"\n";}*/
}

时间: 2024-08-13 23:53:10

dfs(0634-数独)的相关文章

【原创】一个基于简单剪枝的DFS解数独程序

问题来源:leetCode Sudoku Solver Write a program to solve aSudoku puzzle by filling the empty cells. Empty cells are indicated by the character *.*. You may assume that there will be only one unique solution. 问题链接: https://oj.leetcode.com/problems/sudoku-

HDU 1426 Sudoku Killer(dfs 解数独)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1426 Sudoku Killer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9804    Accepted Submission(s): 2944 Problem Description 自从2006年3月10日至11日的首届数独世界

【DFS】数独游戏

DFS(深度优先搜索): 深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点.整个进程反复进行直到所有节点都被访问为止.属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n).(一条路走到黑,直到走不下去才往回走) 基本模板: int check(参数) { if(满足条件) return 1;

POJ 3074&amp;&amp;2676 数独DFS

经典数独问题 用DFS模拟数独解法,找摒除解和余数解 数独解法:http://www.sudokufans.org.cn/forums/topic/8/ 2676 #include "stdio.h" #include "string.h" struct node { int x,y; int s[10]; // 对于每个空格,数字i是否可用 int sum; // 对于每个空格,一共可以填入的数字种数 }order[101]; int cnt; // 总空格数 c

数独题的生成与解决方法

前言 最近在学习Java,在梁勇的 Introduction to Java Programming 10ed 中看到了一个数独问题的例子,这个例子其实是引导学习二维数组的例子,书本中给出的例子也比较简单,就是判断一个数独答案是不是正确的. 其实进行到这,学习知识的目的已经达到了,但是只能输入一个数独答案判断一下是否正确,这实在是太太太太太傻了,不知道有多傻.我始终按耐不住心中那股探索欲,我要做一个生成数独题的程序,同时它还能自己解决.于是这就开启了潘多拉的魔盒. 背景 数独是一种源自18世纪末

leetcode 题解代码整理 36-40题

Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character '.'. A partially filled sudoku which is valid. 判断数独当前状态是否合法 class Solut

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

bjwc Day0 大型签到日

1.18期末考试 1.19试卷讲评 1.20我开始了bjwc愉快的冬眠之旅 上午先是颁发noip一等奖 我在台下笑得像个没有一等奖的孩子/手动微笑 然后去机房试了一下机 坐在鸡神边上,键盘竟然是坏的,生气 上午只剩一个小时 顺手A了一道SDOI2015的题 下午讲dfs搜数独只能说hwd太强辣 一个玄学的剪枝,当时听懂了,回家忘光了 滑稽 于是愉快的一天就这么过去了,晚上颓+顺数A了SDOI2015第二题+看lpl 原文地址:https://www.cnblogs.com/Kong-Ruo/p/

HDU 1426 Sudoku Killer【DFS 数独】

自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品———HDU免费七日游外加lcy亲笔签名以及同hdu acm team合影留念的机会. 所以全球人民前仆后继,为了奖品日夜训练茶饭不思.当然也包括初学者linle,不过他太笨了又没有多少耐性,只能做做最最基本的数独题,不过他还是想得到那些奖品,你能帮帮他吗?你只要把答案告诉他就可以,不用教他是怎么做的

POJ Sudoku 数独填数 DFS

题目链接:Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18105   Accepted: 8772   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 Fig