poj2676--Sudoku(搜索练习5-数独游戏)

Sudoku

Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d
& %I64u

Submit Status

Appoint description: 
System Crawler  (2013-01-21)

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

找出每一行,每一列,每一个小方格中可以填的数,进行dfs搜索结果

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
int l[10][10] , r[10][10] , c[10][10] ;
struct node
{
    int x , y ;
} p[100] ;
int num ;
char str[12][12] ;
int dfs(int k)
{
    if( k == num ) return 1 ;
    int x = p[k].x , y = p[k].y ;
    int i ;
    for(i = 1 ; i <= 9 ; i++)
    {
        if( !r[x][i] && !l[y][i] && !c[x/3*3+y/3][i] )
        {
            r[x][i] = l[y][i] = 1 ;
            c[x/3*3+y/3][i] = 1 ;
            str[x][y] = i + '0' ;
            if( dfs(k+1) )
                return 1 ;
            str[x][y] = '0' ;
            r[x][i] = l[y][i] = 0 ;
            c[x/3*3+y/3][i] = 0 ;
        }
    }
    return 0 ;
}
int main()
{
    int t , i , j  ;
    scanf("%d", &t) ;
    while( t-- )
    {
        num = 0 ;
        memset(l,0,sizeof(l)) ;
        memset(r,0,sizeof(r)) ;
        memset(c,0,sizeof(c)) ;
        for(i = 0 ; i < 9 ; i++)
        {
            scanf("%s", str[i]) ;
            for(j = 0 ; j < 9 ; j++)
            {
                if( str[i][j] != '0' )
                {
                    r[i][ str[i][j] - '0' ] = 1 ;
                    l[j][ str[i][j] - '0' ] = 1 ;
                    c[ i/3*3+j/3 ][ str[i][j] - '0' ] = 1 ;
                }
                else
                {
                    p[num].x = i ;
                    p[num++].y = j ;
                }
            }
        }
        dfs(0) ;
        for(i = 0 ; i < 10 ; i++)
            printf("%s\n", str[i]) ;
    }
    return 0;
}
时间: 2024-12-29 09:07:49

poj2676--Sudoku(搜索练习5-数独游戏)的相关文章

LeetCode:Valid Sudoku,Sudoku Solver(数独游戏)

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. Note: A valid Sudoku boa

POJ2676 Sudoku [数独]

好题,也很实用,犯了几个错误 1.在枚举赋值的时候,思维有个错误:当当前的赋值不能填完这个数独,应该是继续下一个循环,而不是return false 终止枚举 2.Generic Programing写错了,,,本来那个memset想写成Generic Programing的,,,然后,永远只有第一组结果对 不说了,泪哈,,, #include <cstdio> #include <cstring> #include <iostream> #include <cs

数独游戏求解程序

最近玩数独游戏,每行.每列.以及9宫格都包含1-9个数组.觉得这东西很适合用程序来求解.于是我就仿照中国象棋的暴力搜索算法(可参考我之前写的文章极大极小搜索算法),写了一个程序求解数独,直接贴代码了 /** * 模仿象棋程序的搜索算法,写一个求解数独的程序 * @author royhoo * */ public class ShuDu { private int[][] board; // 数独矩阵 private int zeroNum; // 缺失的数字个数 private int fil

5乘5的数独游戏

用了三个周的业余时间,日思夜想的牵挂才把5乘5的数独游戏填满了二十五个宫格. 在这前一篇<数独游戏新篇章>里面,通过对第一个宫格使用位移变换来得到后面的二十四个宫格,总觉得没有什么意思.现在可以通过回溯的办法填满整个二十五个宫格,又觉得这样的结果好像120个点的连通图里面的哈密顿回路的条数那样多得不可思议,所以就想在一个已经填入了一部分数字的情况下,再把其余的格子填满,因为已经有了可以解决3乘3标准数独的基础(前一篇那一个是芬兰数学家给出的世界最难标准数独,编写的程序运行十小时就能得到结果,就

C语言学习 数独游戏

摘要:花了1周多时间学习了C语言,开始练手写解数独游戏的程序. 作者:乌龙哈里 时间:2015-11-22 平台:Window7 64bit,TCC 0.9.26(x86-64 Win64) 参考: 互动百科 数独 章节: 正文: 原来也用C#和Go语言写过,主要思路是暴力撞大运破解.思路什么的在程序了都注释了,不多说了.可能是没用什么先进的算法,感觉C解题速度和C#差不多(除了C#第一次运行之外),基本上出来一个数独表都不用1秒. 附完整程序: 1 /*********************

数独游戏代码

//数独游戏c++ class CSudoku { int map[9][9]; int blanks; int smod; int solves; int check(int,int,int*); void dfs(); public: enum{ANY=0,ALL=1}; CSudoku(int); CSudoku::CSudoku(int *data); void SudokuGenerator(int); //随机生成数独,n越大越难 void SudokuGenerator(int *

poj2676 Sudoku(DFS)

做了很久还是参考了别人的答案orz,其实也不难啊.我要开始学一下怎么写搜索了... 题目链接:poj2676 Sudoku 题解:暴力搜索,DFS每个空白格子所放数字. 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 bool row_f[9][

Swift数独游戏优化&mdash;&mdash;C++与OC混编、plist自动生成

一.为什么要C++与OC混编? 在我之前的数独游戏中涉及到的数独游戏生成算法是参考的网上其他人的算法,是利用C++来实现的.   但是在我的例子中我发现这样存在一定的局限性: 1.我是利用Terminal的重定向功能来实现输出的,这样不能查看程序的实际运行状态信息. 2.C++编写的代码不能直接生成plist文件,而OC有直接的API可以生成plist文件.(当我前几天刚知道的时候我感觉之前用C++生成plist是有多勇敢)   二.如何进行C++与OC混编? 1.OC文件后缀改为"mm&quo

使用双向十字链表(或Dancing Links)解数独游戏

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct Data { void assign(int x,int y,int z) { row=x; col=y; val=z; } int row,col,val; } data[730]; struct Node { Node(int x=0,int y=0): row(x),col(y),up(this)

POJ2676 Sudoku - DFS

POJ2676 Sudoku 传送门 题意: 填充未完成的数独...(就这么简单.... 思路: 爆搜即可. 可行性剪枝:用三个\(bool\)数组分别记录行.列.\(3*3\)的块中,\(9\)种数字的使用情况 AC Code: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=9+10; char s[N][N];int mp[N][N];