华为OJ(数独游戏-Sudoku)

 

 

 

描述

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

知识点 查找,搜索,排序
运行时间限制 10M
内存限制 128
输入

包含已知数字的9X9盘面数组[空缺位以数字0表示]

输出

完整的9X9盘面数组

Sample Input

103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107

Sample Output

143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127


#include <iostream>

using namespace std;

int num[9][9];

void input()
{
    for(int i=0;i<9;i++)
        for(int j=0;j<9; j++)
        {
            char t;
            cin>>t;
            num[i][j]=t-'0';
        }
}


void output()
{
    for(int i=0;i<9;i++)
    {
        for(int j=0;j<8; j++)
        {
            cout<<num[i][j]<<" ";
        }
        cout<<num[i][8];
        cout<<endl;
    }
    cout<<endl;
}

bool check(int i, int j, int t)
{
    //row
    for(int x=0; x<9; x++)
        if(num[i][x]==t)
            return false;

    //column
    for(int x=0; x<9; x++)
        if(num[x][j]==t)
            return false;
    //square
    int k,w;
    k=i/3*3;
    w=j/3*3;
    for(int i=k;i<k+3; i++)
        for(int j=w; j<w+3; j++)
            if(num[i][j]==t)
                return false;
    return true;

}

int answer_count=0;

void dfs(int n)
{
    if(n>80)
    {
        output();
        answer_count++;
        return;
    }
    int i,j;
    i=n/9;
    j=n%9;

    //未放过
    if(num[i][j]!=0)
    {
        dfs(n+1);
    }
    else
    {
        for(int t=1; t<=9; t++)
        {

            if(check(i, j, t))
            {
                num[i][j]=t;
                dfs(n+1);
                if(answer_count>0)
                    return;
                num[i][j]=0;
            }
        }
    }

}
int main()
{
    input();
    dfs(0);
    cout<<"finished"<<endl;
    return 0;
}
posted @ 2018-04-12 11:03  katago  阅读(1211)  评论(0)    收藏  举报