poj 2676 Sudoku (基础DFS)

原创 2015年07月10日 16:32:07


Sudoku
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 15456   Accepted: 7574   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 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

Source



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


题目大意:数独游戏。用9个数字填满一个有9*9个格子的棋盘,有的格子里已经填有数字,有的格子是空白格子,标记为0,要求在空白格子中填入数字,保证每行每列每个小九宫格里1-9个数字都出现。


解题思路:枚举9个数字,DFS搜索满足填入数字的情况,经典搜索题。


代码如下:

#include <cstdio>
#include <cstring>
int a[10][10];
char s[10][10];
bool p;
bool ok(int k,int x,int y)  //判断数字k是否满足条件
{
	for(int i=0;i<9;i++)    //保证每行不出现重复数字
		if(a[x][i]==k)
			return false;   //保证每列不出现重复数字
	for(int i=0;i<9;i++)
		if(a[i][y]==k)
			return false;
	x=x-x%3,y=y-y%3;
	for(int i=x;i<x+3;i++)  //保证每个小九宫格里不出现重复数字
		for(int j=y;j<y+3;j++)
		{
			if(a[i][j]==k)
				return false;
		}
	return true;
}
void dfs(int x,int y)   //x,y是当前格子的横纵坐标
{
	if(p||x==9)         //x为9时说明格子已填满,p标记搜索成功,返回
	{
		p=true;
		return;
	}
	while(a[x][y])      //当格子里有数字时改变坐标直道得到空格子
	{
		if(y==8)
		{
			x++;
			y=0;
		}
		else
		y++;
		if(x==9)
		{
			p=true;
			return;
		}
	} 
	for(int k=1;k<=9;k++)   //枚举九个数字,判断这些数字是否能填入当前格子
	{
		if(ok(k,x,y))
		{
			a[x][y]=k;
			if(y==8)
				dfs(x+1,0);
			else
				dfs(x,y+1);
			if(p)
				return;
			a[x][y]=0;
		}
	}
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		p=false;
		for(int i=0;i<9;i++)
		{
			scanf("%s",s[i]);
			for(int j=0;j<9;j++)
				a[i][j]=s[i][j]-'0';
		}
		dfs(0,0);
		for(int i=0;i<9;i++)
		{
			for(int j=0;j<9;j++)
				printf("%d",a[i][j]);
			printf("\n");
		}
	}
	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

POJ 2676 数独 && 编程之美1.15

算法讲解: low逼算法DFS,这里如果不用空间换时间会TLE 所以说我们加入三个判断矩阵 hang[x][i] 第x行有没有出现i lie[x][i] 第i列有没有出现i sq[x][y][i...

poj2676 sudoku dfs

传送门:poj2676 题意就是解数独呗。。 解题的关键在于book数组,一开始我的book[i][j][k]是用来记录i,j点上可不可以用k这个数字,然后dfs的时候每在i,j点填入一个值k,就将第...

POJ 2676 Sudoku dfs

题意:九宫格游戏。给定一个九宫格,他的每一行每一列以及每一个3*3的子格都必须由1,2,3,4,5,6,7,8,9组成。不能多也不能少。求出一种满足条件的填充方案。 题解:貌似正搜得效率比反搜差不少...
  • Tsaid
  • Tsaid
  • 2011年09月08日 01:34
  • 399

POJ 2676 Sudoku(DFS)

Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16024   Accepted: 7824   S...

POJ-2676-Sudoku-DFS

题意:每行每列每个九空格数字不同,输出一种符合题意即可 思路: DFS&暴力 #include #include #include int mp[10][10]; int mx[10][10]; in...

【POJ 2676】Sudoku数独(DFS)

思路:DFS遍历解数独,很有意思的题目,由于行、列、每一个3*3小方格都不能重复,故需要三个数组row,col,dig来标记某1~9数字是否出现。DFS遍历,具体思路见注释。...

POJ 2676-Sudoku(DFS)

Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14120   Accept...

[DFS]poj 2676 Sudoku 数独问题

Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14917   Accepted: 7372   S...

POJ-2676 Sudoku(DFS)

题意:将数字1到9,填入9x9矩阵中的小方格,使得矩阵中的每行,每列,每个3x3的小格子内,9个数字都会出现。 思路:dfs  挨个尝试 #include #include #include u...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2676 Sudoku (基础DFS)
举报原因:
原因补充:

(最多只允许输入30个字)