zoukankan      html  css  js  c++  java
  • hdu1426数独游戏Sudoku Killer DFS

    **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
    **
    思路 :判断问号处应该填何值时,首先在9*9的大矩阵中,枚举1-9的数,判断该问号所在行和列是否有该数的存在,再在3*3的小矩阵中,枚举1-9的数,判断该问号处的小矩阵是否有该数的存在。

    #include<stdio.h>
    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int num;
    int fun;
    int map[10][10];
     struct node{
        int x;
        int y;
    }p[81];
    
    int check(int n,int m)
    {
        int tx,ty;
        int i,j;
        /*判断行列是否有该数 的存在*/
        for( i = 0; i < 9; i ++)
        {
            if(map[p[n].x][i]==m||map[i][p[n].y]==m)
                return 0;
        }
        tx = p[n].x/3*3;
        ty = p[n].y/3*3;
        /*判断3*3的小正方形内是否已经有该数的存在*/
        for( i = 0; i < 3; i ++)
        {
            for( j = 0; j < 3; j ++)
            {
                if( map[tx+i][ty+j]==m)
                    return 0;
            }
        }
        return 1;
    }
    void dfs(int n)
    {
        int i,j;
        if( n == num)
        {
            for( i = 0; i < 9; i ++)
            {
                for( j = 0; j < 8; j ++)
                {
                    printf("%d ",map[i][j]);
                }
                printf("%d
    ",map[i][8]);
            }
            fun = 1;
    
    
    
        }
        else
        {
            for( i = 1; i <= 9; i ++)
            {
                if(check(n,i)&&!fun)/*填的数合法且最终答案没有形成*/
                {
                    map[p[n].x][p[n].y] = i;/*填表*/
                    dfs(n+1);/*递归*/
                    map[p[n].x][p[n].y] = 0;/*回溯*/
                }
            }
        }
        return;
    }
    int main()
    {
        char s;
        int i,j;
        int count = 0; 
        while(cin>>s)
        {
            num = 0;
            fun = 0;
            if(s == '?')
            {
                map[0][0] = 0;
            }
            else
            {
                map[0][0] = s-'0';
            }
            for( i = 0; i < 9; i ++)
            {
                for( j = 0; j < 9; j ++)
                {
                    if(!(i==0&&j==0))
                        cin>>s;
                    if( s == '?')
                    {
                        p[num].x = i;
                        p[num].y = j;
                        map[i][j] = 0;
                        num++;
                    }
                    else
                    {
                        map[i][j] = s-'0';
                    }
                }
            }
            if(count++)
                printf("
    "); 
            dfs(0);
        }
        return 0;
    }
    

    后记:话说,第一次感受到c++的输入魅力,自动跳空格啊 在这道题好用到哭,开始我是用c处理,比这麻烦了很多哇。

  • 相关阅读:
    Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础
    Android Studio 单刷《第一行代码》系列 04 —— Activity 相关
    Android Studio 单刷《第一行代码》系列 03 —— Activity 基础
    Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat
    Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld
    IDEA 内网手动添加oracle,mysql等数据源,以及server returns invalid timezone错误配置
    eclipse maven设置
    IntelliJ IDE 常用配置
    eclipse maven 常见问题解决方案
    Maven 安装和配置
  • 原文地址:https://www.cnblogs.com/hellocheng/p/7350157.html
Copyright © 2011-2022 走看看