Sudoku 数独游戏

#include<iostream>
using namespace std;

bool heng(int **sudo, int a, int b, int value)
{
    bool flag = true;
    for(int i=0; i<9; i++)
    {
        if(sudo[a][i]==value)
        {
            flag = false;
        }
    }
    return flag;
}

bool shu(int **sudo, int a, int b, int value)
{
    bool flag = true;
    for(int i=0; i<9; i++)
    {
        if(sudo[i][b]==value)
        {
            flag = false;
        }
    }
    return flag;
}

bool fang(int **sudo, int a, int b, int value)
{
    bool flag = true;
    int x = a/3*3;
    int y = b/3*3;

    for(int i = 0; i<3; i++)
    {
        for(int j=0; j<3; j++)
        {
            if(sudo[x+i][y+j]==value)
            {
                flag = false;
            }
        }
    }
    return flag;
}

void dfs(int a, int b, int **sudo, bool &flag)
{
    if(a==9 && b==0)
    {
        for(int i=0; i<9; i++)
        {
            for(int j=0; j<8; j++)
            {
                cout<<sudo[i][j]<<‘ ‘;
            }
            cout<<sudo[i][8]<<endl;
        }
        flag = false;//find
        return;
    }
    else
    {
        if(flag)
        {
            if(sudo[a][b]==0)
            {
                for(int i=1; i<=9; i++)
                {
                    if(flag && heng(sudo, a, b, i) && shu(sudo ,a, b,i) && fang(sudo, a, b, i))
                    {
                        sudo[a][b] = i;
                        dfs( (b==8)?a+1:a, (b==8)?0:b+1, sudo, flag);
                        sudo[a][b] = 0;
                    }
                }
            }
            else
            {
                dfs( (b==8)?a+1:a, (b==8)?0:b+1, sudo, flag);
            }
        }
        else
        {
            return ;
        }
    }
}

int main()
{
    int **sudo;
    sudo = new int* [9];
    for(int i=0; i<9; i++)
    {
        sudo[i] = new int [9];
    }

    for(int i=0; i<9; i++)
    {
        for(int j=0; j<9; j++)
        {
            cin>>sudo[i][j];
        }
    }

    //dfs
    bool flag = true;
    dfs(0,0,sudo, flag);

    for(int i=0; i<9; i++)
    {
        delete [] sudo[i];
    }
    delete [] sudo;

    return 0;
}

  

描述
问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个粗线宫内的数字均含1-9,并且不重复。
输入:
包含已知数字的9X9盘面数组[空缺位以数字0表示]
输出:
完整的9X9盘面数组

知识点 查找,搜索,排序
运行时间限制 10M
内存限制 128
输入
包含已知数字的9X9盘面数组[空缺位以数字0表示]

输出
完整的9X9盘面数组

样例输入 0 9 2 4 8 1 7 6 3 4 1 3 7 6 2 9 8 5 8 6 7 3 5 9 4 1 2 6 2 4 1 9 5 3 7 8 7 5 9 8 4 3 1 2 6 1 3 8 6 2 7 5 9 4 2 7 1 5 3 8 6 4 9 3 8 6 9 1 4 2 5 7 0 4 5 2 7 6 8 3 1
样例输出 5 9 2 4 8 1 7 6 3 4 1 3 7 6 2 9 8 5 8 6 7 3 5 9 4 1 2 6 2 4 1 9 5 3 7 8 7 5 9 8 4 3 1 2 6 1 3 8 6 2 7 5 9 4 2 7 1 5 3 8 6 4 9 3 8 6 9 1 4 2 5 7 9 4 5 2 7 6 8 3 1
时间: 2024-08-11 05:45:48

Sudoku 数独游戏的相关文章

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

2015南阳CCPC H - Sudoku 数独

H - Sudoku 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 4×4 board

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 *

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

POJ 2676 Sudoku (数独 DFS)

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14368   Accepted: 7102   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

数独游戏求解程序

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

数独游戏的设计与实现

前景:数独游戏,是一种数学智力拼图游戏,是“独立的数字游戏”的简称,源自18世纪末的瑞士,后在美国发展,在日本得以发扬光大. 数独游戏可以训练玩家的逻辑推理能力,不少教育者皆认为数独是锻炼脑筋的好方法. 然而如何制作出这个游戏?首先要了解它的规则: 1.游戏会从一个部分带有数字的九宫格开始. 在9×9的大九宫格(即3格宽×3格高)方阵里,每一格又细分为一个小九宫格. 2.游戏开始,已给定若干数字,其它宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字. 3.填数字时必须满足以下条件:在空

5乘5的数独游戏

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