hrbust 1955 数独

数独
Time Limit: 2000 MSMemory Limit: 32768 K
Total Submit: 80(23 users)Total Accepted: 29(20 users)Rating:Special Judge: No
Description
数独应该是一个大家都玩过的游戏,说的就是在一个9*9的方格中填入一些数字,符合以下规则:
1.每一列或每一行中1-9只能出现一次。
2.这个数独划分成的9个小的3*3的方格矩阵内,从1-9的每个数只能出现一次。
Input


输入数据的第一行包括一个整数T,表示有T组测试数据。

每组数据由9行组成,每行由9个整数或者*组成,其中*表示空白的格子。


Output


每组数据输出9行,每行9个整数,表示整个数独。

每两组输出之间有一个空行。


Sample Input
1
*864*2*3*
**3**819*
**2**9**8
7*9**52**
6**92***3
**17**8*9
3**2**7**
*671**9**
*1*5*732*
Sample Output
986412537
543678192
172359648
739845261
658921473
421763859
395286714
267134985
814597326
Hint
数据保证答案唯一。

用dfs暴力搜索就行

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int MAX = 10;

int mapp[MAX+9][MAX+9];
bool flag;

bool pan(int num,int x)//判断当前数字是否重复
{
    int hang = num/9;
    int lie = num%9;
    for(int h = 0;h < 9;h++){
        if(mapp[h][lie] == x)
            return false;
    }
    for(int l = 0;l < 9;l++){
        if(mapp[hang][l] == x)
            return false;
    }
    int fhang = 3*(hang/3);
    int flie = 3*(lie/3);
    for(int h = fhang;h < fhang+3;h++){
        for(int l = flie;l < flie+3;l++){
            if(mapp[h][l] == x)
               return false;
        }
    }
    return true;
}

void dfs(int num)//从第0格开始搜,一直到第80格
{
    if(num > 80 || flag){
        flag = true;
        return ;
    }

    int hang = num/9;
    int lie = num%9;
    if(mapp[hang][lie] != 0){
        dfs(num+1);
        if(flag)
            return ;
    }
    else{
        for(int i = 1;i <= 9;i++){
            if(pan(num,i)){
                mapp[hang][lie] = i;
                dfs(num+1);
                if(flag)
                    return ;
                mapp[hang][lie] = 0;
            }
        }
    }

}

int main()
{
    int t;
    scanf("%d",&t);
    for(int Case = 1;Case <= t;Case++){
        flag = false;
        memset(mapp,0,sizeof(mapp));
        for(int i = 0;i < 9;i++){
            getchar();
            for(int j = 0;j < 9;j++){
                char word;
                scanf("%c",&word);
                if(word == '*')
                    mapp[i][j] = 0;
                else mapp[i][j] = word-'0';
            }
        }
        dfs(0);
        
        for(int i = 0;i < 9;i++){
            for(int j = 0;j < 9;j++){
               printf("%d",mapp[i][j]);
            }printf("\n");
        } printf("\n");
    }
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值