Sudoku Killer

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3367    Accepted Submission(s): 1063

Problem Description
自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视。 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品———HDU免费七日游外加lcy亲笔签名以及同hdu acm team合影留念的机会。 所以全球人民前仆后继,为了奖品日夜训练茶饭不思。当然也包括初学者linle,不过他太笨了又没有多少耐性,只能做做最最基本的数独题,不过他还是想得到那些奖品,你能帮帮他吗?你只要把答案告诉他就可以,不用教他是怎么做的。
数独游戏的规则是这样的:在一个9x9的方格中,你需要把数字1-9填写到空格当中,并且使方格的每一行和每一列中都包含1-9这九个数字。同时还要保证,空格中用粗线划分成9个3x3的方格也同时包含1-9这九个数字。比如有这样一个题,大家可以仔细观察一下,在这里面每行、每列,以及每个3x3的方格都包含1-9这九个数字。
例题:
Input
本题包含多组测试,每组之间由一个空行隔开。每组测试会给你一个 9*9 的矩阵,同一行相邻的两个元素用一个空格分开。其中1-9代表该位置的已经填好的数,问号(?)表示需要你填的数。
Output
对于每组测试,请输出它的解,同一行相邻的两个数用一个空格分开。两组解之间要一个空行。 对于每组测试数据保证它有且只有一个解。
Sample Input
7 1 2 ? 6 ? 3 5 8
? 6 5 2 ? 7 1 ? 4
? ? 8 5 1 3 6 7 2
9 2 4 ? 5 6 ? 3 7
5 ? 6 ? ? ? 2 4 1
1 ? 3 7 2 ? 9 ? 5
? ? 1 9 7 5 4 8 6
6 ? 7 8 3 ? 5 1 9
8 5 9 ? 4 ? ? 2 3

Sample Output
7 1 2 4 6 9 3 5 8
3 6 5 2 8 7 1 9 4
4 9 8 5 1 3 6 7 2
9 2 4 1 5 6 8 3 7
5 7 6 3 9 8 2 4 1
1 8 3 7 2 4 9 6 5
2 3 1 9 7 5 4 8 6
6 4 7 8 3 2 5 1 9
8 5 9 6 4 1 7 2 3

Author
linle
Source
ACM暑期集训队练习赛(三)
Recommend
LL
思路:DFS,这个题的输入输出格式要注意,好恶心的输出格式,PE无数次
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int map[10][10];
int hash[10][10][10];
int flag;
int ans;
int sum;
int str;
struct Node
{
    int x;
    int y;
};
Node empty[100];
bool judge(int step,int k)
{
    int x = empty[step].x;int y = empty[step].y;
    for(int i = 1;i <= 9;i ++)
        if(k == map[i][y])
            return false;
    for(int i = 1;i <= 9;i ++)
        if(k == map[x][i])
            return false;
    if(x <= 3)
    {
        if(y <= 3)
        {
            for(int i = 1;i <= 3;i ++)
                for(int j = 1;j <= 3;j ++)
                    if(map[i][j] == k)
                       return false;
        }
        if(y <= 6 && y > 3)
        {
            for(int i = 1;i <= 3;i ++)
               for(int j = 4;j <= 6;j ++)
                  if(map[i][j] == k)
                      return false;
        }
        if(y <= 9 && y > 6)
        {
            for(int i = 1;i <= 3;i ++)
               for(int j = 7;j <= 9;j ++)
                   if(map[i][j] == k)
                       return false;
        }
    }
    if(x > 3 && x <= 6)
    {
        if(y <= 3)
        {
            for(int i = 4;i <= 6;i ++)
                for(int j = 1;j <= 3;j ++)
                    if(map[i][j] == k)
                       return false;
        }
        if(y <= 6 && y > 3)
        {
            for(int i = 4;i <= 6;i ++)
               for(int j = 4;j <= 6;j ++)
                  if(map[i][j] == k)
                      return false;
        }
        if(y <= 9 && y > 6)
        {
            for(int i = 4;i <= 6;i ++)
               for(int j = 7;j <= 9;j ++)
                   if(map[i][j] == k)
                       return false;
        }
    }
    if(x > 6 && x <= 9)
    {
        if(y <= 3)
        {
            for(int i = 7;i <= 9;i ++)
                for(int j = 1;j <= 3;j ++)
                    if(map[i][j] == k)
                       return false;
        }
        if(y <= 6 && y > 3)
        {
            for(int i = 7;i <= 9;i ++)
               for(int j = 4;j <= 6;j ++)
                  if(map[i][j] == k)
                      return false;
        }
        if(y <= 9 && y > 6)
        {
            for(int i = 7;i <= 9;i ++)
               for(int j = 7;j <= 9;j ++)
                   if(map[i][j] == k)
                       return false;
        }
    }
    return true;;
}
void DFS(int step)
{
    if(sum + 1 == step)
    {
        flag = 1;
        return ;
    }
    for(int i = 1;i <= 9;i ++)
    {
        if(judge(step,i) == 1)
        {
            map[empty[step].x][empty[step].y] = i;
            DFS(step + 1);
            if(flag == 1)
                return ;
            map[empty[step].x][empty[step].y] = 0;
        }
    }
}
int main()
{
    int cnt = 0;
    while(~scanf(" %c",&str))
    {
        memset(hash,0,sizeof(hash));
        memset(map,0,sizeof(map));
        sum = 1;
        if(str == '?')
           {
               empty[sum].x = 1;empty[sum ++].y = 1;
           }
        else
           map[1][1] = str - 48;
        for(int i = 1;i <= 9;i ++)
           for(int j = 1;j <= 9;j ++)
               {
                   if(i == 1 && j == 1)
                       continue ;
                   scanf(" %c",&str);
                   if(str == '?')
                       {
                           empty[sum].x = i;empty[sum ++].y = j;
                       }
                   else
                       map[i][j] = str - 48;
               }
        sum --;
        flag = 0;
        DFS(1);
        if(cnt ++)
            printf("\n");
        for(int i = 1;i <= 9;i ++)
        {
           for(int j = 1;j < 9;j ++)
              printf("%d ",map[i][j]);
           printf("%d\n",map[i][9]);
        }
    }
    return 0;
}
#include<iostream>
using namespace std;
#include<stdio.h>
#include<string.h>
struct point{
    int x,y;
}pur[100];
int map[10][10],flag,num;
int check(int k,int cur)
{
    int i,j,x,y;
    for(i=0;i<9;i++)
        if(map[pur[cur].x][i]==k||map[i][pur[cur].y]==k)return 0;
    x=(pur[cur].x/3)*3;
    y=(pur[cur].y/3)*3;
    for(i=x;i<x+3;i++)
        for(j=y;j<y+3;j++)
            if(map[i][j]==k)return 0;
    return 1;
}
void DFS(int step)
{
    int i,j;
    if(step==num){
        for(i=0;i<9;i++)
        {
            for(j=0;j<8;j++)
                printf("%d ",map[i][j]);
                printf("%d\n",map[i][8]);
            }
            flag=1;
            return;
    }
    else{
        for(i=1;i<=9;i++)
        {
            if(check(i,step)&&!flag)
            {
                map[pur[step].x][pur[step].y]=i;
                DFS(step+1);
                map[pur[step].x][pur[step].y]=0;
            }
        }
    }
    return;
}
int main()
{
    int i,j,cas=0;
    char s[3];
    while(scanf("%s",s)!=EOF)
    {
        num=0;
        if(s[0]=='?'){pur[num].x=0;pur[num].y=0;num++;map[0][0]=0;}
        else map[0][0]=s[0]-'0';
        for(i=0;i<9;i++)
            for(j=0;j<9;j++)
            {
                if(i==0&&j==0)continue;
                scanf("%s",s);
                if(s[0]=='?'){pur[num].x=i;pur[num].y=j;num++;map[i][j]=0;}
                else map[i][j]=s[0]-'0';
            }
        flag=0;
        if(cas++)printf("\n");
        DFS(0);
    }
    return 0;
}

转载于:https://www.cnblogs.com/GODLIKEING/p/3330943.html

HDU 1476 Sudoku Killer相关推荐

  1. HDU 1426 Sudoku Killer【DFS 数独】

    自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视.  据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品 ...

  2. HDU 1426 Sudoku Killer

    数独(DFS). 非常忧伤的一道题,先是剪枝的三个数组开成[9][9]导致 越界了WA. 然后就是每两组输出之间有空行,可是最后一组后面不能输出空行.PE好多次. #include<cstdio ...

  3. HDU1426 Sudoku Killer DFS

    点击打开链接 Sudoku Killer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  4. 杭电oj 1426 Sudoku Killer(深度优先搜索 回溯)

    Sudoku KillerTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  5. Sudoku Killer(HDU-1426)

    Problem Description 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行 ...

  6. hdu1426 Sudoku Killer

    简单的DFS,将所有未填的位置依次保存起来,之后,对每一个未填的位置依次枚举,往下搜即可 :: 本来想用DLX的做的,hdu3111是过了,可是原先那个模板在这道题里就是超时,不解啊,换一个模板就过了 ...

  7. 杭电OJ分类题目(1)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(1) HDU Introduction HDU ...

  8. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  9. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

最新文章

  1. Nginx服务启动脚本
  2. 技术专家预测未来25大颠覆性硬趋势
  3. 获取服务(getService)
  4. Erlang的边界检查(3)
  5. 机器学习Sklearn实战——adaboost
  6. Java中栈和队列的用法 Stack And Queue
  7. Linux内核分析 - 网络
  8. 谷歌地球最新host_听说《流浪地球》被豆瓣鄙视了,我们用数据看一把真相(上)...
  9. 特别看好高校团队的联想创投,在中科大拉开高校AI精英挑战赛大幕
  10. CPU-AMD处理器的驱动下载地址
  11. python 排程问题仿真_APS自动生产排程系统-用户常见问题及解答
  12. 拟物化设计与扁平化设计
  13. 他是马化腾的偶像,拒绝马云的应聘 !如今劝年轻人不要太拼、要认命......
  14. Photoshop(PS)CC2020安装教程【64位】
  15. 本次技术博客平台的选择
  16. 如何入门Python之Python基础教程详解
  17. Your Command Line Tools are too outdated
  18. 统计学之离散指标(全距、内距、异众比率、平均差与标准差)
  19. socks5代理IP的几种测试工具
  20. idea高版本设置注入飘红(红色波浪线)

热门文章

  1. 在微型计算机中1 mb准确等于几个字,2010安徽省计算机等级考试二级试题及答案...
  2. 输出指定范围内的完数
  3. 《零基础》MySQL 教程(一)
  4. ccf魔数c语言,ccf 201609-4 交通规划
  5. 安装了虚拟机后mysql用不了_在虚拟机上安装mysql,安装好了并且初始化之后,一直无法启动mysql如何解决?...
  6. java下文_java实现文件下载的两种方式
  7. mysql的操作语句_Mysql最常用的操作语句收集
  8. MySQL 常用运算符
  9. Redis DeskTop Manager 使用教程
  10. 删除a标签下面的横线