数独
题目描述:
这个游戏只有一个规则:
将格子填满使得每一行,每一列,和每一个小的九宫格,恰好包含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;
}