数独

数独

题目描述:
这个游戏只有一个规则:
将格子填满使得每一行,每一列,和每一个小的九宫格,恰好包含1-9这9个数字
正是由于规则简单而又变化多端,数独一时间风靡全球。
现在,我们希望你能编写一个程序解决数独问题。
输入:
输入数据一共9行,每行有9个字符。
输入数据描述了一个待解决的数独,其中,“?”表示数独中的空缺。
我们的输入数据总保证有唯一解。
输出:
输入数据一共9行,每行有9个字符。
输入数据描述了一个待解决的数独,其中,“?”表示数独中的空缺。
我们的输入数据总保证有唯一解。
样例输入:

5????7??6
?6????5?4
?834?????
???182?4?
??1???9??
?7?369???
?????543?
1?5????9?
7??2????1

样例输出:

514927386
967831524
283456179
659182743
321574968
478369215
892615437
135748692
746293851

思路:纯暴力dfs,写的时候还有点小插曲,dfs的时候,写了回溯却忘了return,找了半天bug。。。
以后玩数独,嘿嘿,有点流氓……

#pragma GCC optimize(3,"Ofast","inline")
#pragma G++ optimize(3)
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
typedef queue<int> q_i;
typedef queue<string> q_s;
typedef queue<double> q_d;
typedef queue<ll> q_ll;
typedef priority_queue<int> pq_i;
typedef priority_queue<string> pq_s;
typedef priority_queue<double> pq_d;
typedef priority_queue<ll> pq_ll;
typedef stack<int> s_i;
typedef stack<string> s_s;
typedef stack<double> s_d;
typedef stack<ll> s_ll;
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,l,r) for(int i=r;i>=l;i--)
#define eif else if
#define N 1000
#define mm(dp) memset(dp,0,sizeof(dp))
#define mm1(dp) memset(dp,-1,sizeof(dp))
const double e=2.71828182845;
const double pi = acos(-1.0);
void read(int &x)
{
    char ch=getchar();
    x=0;
    for(; ch<'0'||ch>'9'; ch=getchar());
    for(; ch>='0'&&ch<='9'; x=x*10+ch-'0',ch=getchar());
}
inline void write(int x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
}
double InvSqrt (double x)
{
    double xhalf = 0.5f*x;
    int i = *(int*)&x;
    i = 0x5f3759df - (i >> 1);
    x = *(double*)&i;
    x = x*(1.5f - xhalf*x*x);
    return 1/x;
}
string str;
int a[10][10];
int heng[10][10];
int shu[10][10];
int jiu[10][10];
int cnt;
void dfs(int num)
{
    if(num==cnt)
    {
        rep(i,1,9)
        {
            rep(j,1,9)
            {
                cout<<a[i][j];
            }
            cout<<'\n';
        }
    }
    rep(i,1,9)
    {
        rep(j,1,9)
        {
            if(a[i][j]==0)
            {
                int p;
                if(i<=3&&j<=3)
                    p=1;
                eif(i<=3&&j<=6)
                    p=2;
                eif(i<=3&&j<=9)
                    p=3;
                eif(i<=6&&j<=3)
                    p=4;
                eif(i<=6&&j<=6)
                    p=5;
                eif(i<=6&&j<=9)
                    p=6;
                eif(i<=9&&j<=3)
                    p=7;
                eif(i<=9&&j<=6)
                    p=8;
                eif(i<=9&&j<=9)
                    p=9;
                int flag=0;
                rep(k,1,9)
                {
                    if(heng[i][k]==0&&shu[j][k]==0&&jiu[p][k]==0)
                    {
                        flag=1;
                        a[i][j]=k;
                        heng[i][k]=1;
                        shu[j][k]=1;
                        jiu[p][k]=1;
                        dfs(num+1);
                        flag=0;
                        a[i][j]=0;
                        heng[i][k]=0;
                        shu[j][k]=0;
                        jiu[p][k]=0;
                    }
                }
                if(flag==0)
                    return;
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    rep(i,1,9)
    {
        cin>>str;
        rep(j,0,8)
        {
            if(str[j]!='?')
            {
                a[i][j+1]=str[j]-'0';
                heng[i][a[i][j+1]]=1;
                shu[j+1][a[i][j+1]]=1;
                if(i<=3&&j+1<=3)
                    jiu[1][a[i][j+1]]=1;
                eif(i<=3&&j+1<=6)
                    jiu[2][a[i][j+1]]=1;
                eif(i<=3&&j+1<=9)
                    jiu[3][a[i][j+1]]=1;
                eif(i<=6&&j+1<=3)
                    jiu[4][a[i][j+1]]=1;
                eif(i<=6&&j+1<=6)
                    jiu[5][a[i][j+1]]=1;
                eif(i<=6&&j+1<=9)
                    jiu[6][a[i][j+1]]=1;
                eif(i<=9&&j+1<=3)
                    jiu[7][a[i][j+1]]=1;
                eif(i<=9&&j+1<=6)
                    jiu[8][a[i][j+1]]=1;
                eif(i<=9&&j+1<=9)
                    jiu[9][a[i][j+1]]=1;
            }
            else
            {
                a[i][j+1]=0;
                cnt++;
            }
        }
    }
    dfs(0);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值