第一个看到我相信是刚学OI的
by bztMinamoto @ 2018-08-11 16:44:07
~~第一个看到我相信是刚学OI的~~
by 2017zc @ 2018-08-11 16:46:00
刚学OI
by AstoriaG @ 2018-08-11 16:48:31
~~第一个看到我相信是刚学OI的~~
by AstoriaG @ 2018-08-11 16:48:51
???
by Parabola @ 2018-08-11 16:48:53
~~第一个看到我相信是刚学OI的~~
by ylxmf2020 @ 2018-08-11 16:49:39
什么意思?
by Parabola @ 2018-08-11 16:50:49
呀我个傻屌v写成0~8了,但是还不对
by Parabola @ 2018-08-11 16:51:17
在您们眼中DLX这么水的嘛。
by Parabola @ 2018-08-11 17:09:22
# 打表大法好
```cpp
// luogu-judger-enable-o3
#include <iostream>
using namespace std;
int a[11][11];
bool flag[3][11][11];
// flag[0][i][j]代表第i行,值为j的数是否使用
// flag[1][i][j]代表第i列,值为j的数是否使用
// flag[2][i][j]代表第i宫,值为j的数是否使用
int m[10][10]={
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,2,2,2,3,3,3},
{0,1,1,1,2,2,2,3,3,3},
{0,1,1,1,2,2,2,3,3,3},
{0,4,4,4,5,5,5,6,6,6},
{0,4,4,4,5,5,5,6,6,6},
{0,4,4,4,5,5,5,6,6,6},
{0,7,7,7,8,8,8,9,9,9},
{0,7,7,7,8,8,8,9,9,9},
{0,7,7,7,8,8,8,9,9,9}
};
bool check(int xx,int yy,int ii){
if(flag[0][xx][ii]||flag[1][yy][ii]||flag[2][m[xx][yy]][ii]){
return 0;
}
return 1;
}
void dfs(int x,int y){
if (x==10&&y==1) {
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
cout<<a[i][j]<<' ';
}
cout<<endl;
}
return;
}
int tx=x;
int ty=y+1;
if(ty==10){
tx++;
ty=1;
}
if(a[x][y]){
dfs(tx,ty);
}else{
for(int i=1;i<=9;i++){
if(check(x,y,i)){
a[x][y]=i;
flag[0][x][i]=flag[1][y][i]=flag[2][m[x][y]][i]=1;
dfs(tx,ty);
a[x][y]=0;
flag[0][x][i]=flag[1][y][i]=flag[2][m[x][y]][i]=0;
}
}
}
}
int main(){
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
cin>>a[i][j];
if(a[i][j]!=0){
flag[0][i][a[i][j]]=flag[1][j][a[i][j]]=flag[2][m[i][j]][a[i][j]]=1;
}
}
}
dfs(1,1);
return 0;
}
```
by JAMERES86 @ 2018-08-11 17:09:37