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盤面數組ios

知識點 查找,搜索,排序
運行時間限制 10M
內存限制 128
輸入

包含已知數字的9X9盤面數組[空缺位以數字0表示]數組

輸出

完整的9X9盤面數組spa

樣例輸入 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
相關文章
相關標籤/搜索