Problem Description
Yi Sima was one of the best counselors of Cao Cao. He likes to play a funny game himself. It looks like the modern Sudoku, but smaller. Actually, Yi Sima was playing it different. First of all, he tried to generate a × board with every row contains to , every column contains to . Also he made sure that if we cut the board into four × pieces, every piece contains to . Then, he removed several numbers from the board and gave it to another guy to recover it. As other counselors are not as smart as Yi Sima, Yi Sima always made sure that the board only has one way to recover. Actually, you are seeing this because you've passed through to the Three-Kingdom Age. You can recover the board to make Yi Sima happy and be promoted. Go and do it!!! Input
The first line of the input gives the number of test cases, T(≤T≤). T test cases follow. Each test case starts with an empty line followed by lines. Each line consist of characters. Each character represents the number in the corresponding cell (one of '', '', '', ''). '*' represents that number was removed by Yi Sima. It's guaranteed that there will be exactly one way to recover the board. Output
For each test case, output one line containing Case #x:, where x is the test case number (starting from ). Then output lines with characters each. indicate the recovered board. Sample Input **** *
*
*
*
**
***
*
** Sample Output
Case #: Case #:
1243
4312
3421
2134
Case #:
3412
1234
2341
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
#define N 50
#define met(a,b) memset(a,b,sizeof(a));
vector<vector<int> >Q;
struct node
{
int x,y;
}s[N];
char str[N][N];
int te;
int pan(int k,int n)
{
for(int i=;i<;i++)///判断这个点的这一列是否出现过数字k
{
if(i==s[n].x)
continue;
if(str[i][s[n].y]-''==k)
return ;
}
for(int i=;i<;i++)///判断这个点的这一行是否出现过数字k
{
if(i==s[n].y)
continue;
if(str[s[n].x][i]-''==k)
return ;
}
for(int i=;i<=;i++)///判断包含这个点的2*2角落是否出现过数字k
{
for(int j=;j<=;j++)
{
int xx=s[n].x/*+i;
int yy=s[n].y/*+j;
if(xx==s[n].x && yy==s[n].y)
continue;
if(str[xx][yy]-''==k)
return ;
}
}
return ;
}
void dfs(int m)
{
if(te==m)
{
for(int i=;i<;i++)
puts(str[i]);
return ;
}
for(int i=;i<=;i++)
{
if(pan(i,m))///判断数字i是否可以放在这个点上
{
str[s[m].x][s[m].y]=i+'';
dfs(m+);
str[s[m].x][s[m].y]='';
}
}
return ;
}
int main()
{
int t,con=;
scanf("%d",&t);
while(t--)
{
for(int i=;i<;i++)
{
scanf("%s",str[i]);
}
te=;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
if(str[i][j]=='*')///找哪几个点需要填数,一共多少个
{
s[te].x=i;
s[te].y=j;
str[i][j]='';
te++;
}
}
}
printf("Case #%d:\n",con++);
dfs();
}
return ;
}

(hdu)5547 Sudoku (4*4方格的 数独 深搜)的更多相关文章

  1. HDU - 5547 Sudoku(数独搜索)

    Description Yi Sima was one of the best counselors of Cao Cao. He likes to play a funny game himself ...

  2. HDU 5547 Sudoku(DFS)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=5547 题目: Sudoku Time Limit: 3000/1000 MS (Java/Others ...

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

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

  4. HDU 5547 Sudoku (暴力)

    题意:数独. 析:由于只是4*4,完全可以暴力,要注意一下一些条件,比如2*2的小方格也得是1234 代码如下: #pragma comment(linker, "/STACK:102400 ...

  5. [NOIP2009]靶形数独 深搜+枝杈优化

    这道题,又是一位玄学搜索...... 我是用的蜗牛序搜的(顾名思义,@,这么搜),我正着搜80然后一反转比原来快了几十倍........一下AC....... 我的思路是这样的话我们可以从内到外或者从 ...

  6. hdu 1045 要求全部逐一搜索完的深搜

    #include<stdio.h> #include<string.h> int visit[10][10]; char map[10][10]; int n,ans,ss,t ...

  7. HDU 4597 Play Game(记忆化搜索,深搜)

    题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的 ...

  8. HDU 3666 THE MATRIX PROBLEM (差分约束 深搜 & 广搜)

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  9. hdu 1426 Sudoku Killer (dfs)

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

随机推荐

  1. POJ2192 - Zipper(区间DP)

    题目大意 给定三个字符串s1,s2,s3,判断由s1和s2的字符能否组成字符串s3,并且要求组合后的字符串必须是s1,s2中原来的顺序. 题解 用dp[i][j]表示s1的前i个字符和s2的前j个字符 ...

  2. Polya定理

    http://www.cnblogs.com/wenruo/p/5304698.html 先看 Polya定理,Burnside引理回忆一下基础知识.总结的很棒. 一个置换就是集合到自身的一个双射,置 ...

  3. 大型网站应用中MySQL的架构演变史

    没有什么东西是一成不变的,包含我们的理想和生活!MySQL作为一个免费的开源的关系型数据库,深受大家喜爱,从最初的无人问津到当下的去IOE,都体现出了MySQL举足轻重的作用.今天我们就从淘宝的发展来 ...

  4. ABAP SY标签一览 .

    Description: SY-SUBRC:语句执行后的返回值,0表示成功SY-DATUM:当前服务器日期SY-UZEIT:当前服务器时间SY-ULINE:255长度的水平线SY-VLINE:垂直线S ...

  5. Grails教程之--我的理解

    最近工作中接触到了Grails,对于这门技术,网上的资料不算太多,有的基本也是大同小异.我打算边学边写一些东西,毕竟是一个学习的过程,写的东西如果有错误或者理解不正确的地方,还希望大家能指出来.帮助我 ...

  6. HDU 4635 - Strongly connected(2013MUTC4-1004)(强连通分量)

    t这道题在我们队属于我的范畴,最终因为最后一个环节想错了,也没搞出来 题解是这么说的: 最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数尽可能的多,则X部肯 ...

  7. css3随笔

    1 rgba和opacity的区别 RGBA即红色R+绿色G+蓝色B+通道Alpha 语法: R:红色值.正整数 | 百分数 G:绿色值.正整数 | 百分数 B:蓝色值.正整数| 百分数 A:透明度. ...

  8. mybatis generator 使用

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  9. ubuntu14.04启动提示set_sw_state failed

    安装上ubuntu14.04时,系统启动时一直出现一个问题 kernel: [ 16.465893] [drm:rv770_dpm_set_power_state] *ERROR* rv770_set ...

  10. C++实现建立和一二进制树的三个递归遍历

    说明:这篇文章是学习交流,转载请注明出处,欢迎转载! 二叉树是一种常见的数据结构.二叉树的遍历也是家常便饭的事了,这里仅仅写出一个完整的能够执行的C++代码来随便建立一个例如以下图所看到的的二叉树,建 ...