Date: 2019/10/11
Degree of difficulty:Universal
Original question:P1784 数独
这又是一道典型的DFS题
我们来看注意的点
- 如何判断是哪个方格
- 打标记写法
1.判断是哪个方格
判断方格其中可以用打表!!
int vis[11][11]={
{0,0,0,0,0,0,0,0,0,0},//1
{0,1,1,1,2,2,2,3,3,3},//2
{0,1,1,1,2,2,2,3,3,3},//3
{0,1,1,1,2,2,2,3,3,3},//4
{0,4,4,4,5,5,5,6,6,6},//5
{0,4,4,4,5,5,5,6,6,6},//6
{0,4,4,4,5,5,5,6,6,6},//7
{0,7,7,7,8,8,8,9,9,9},//8
{0,7,7,7,8,8,8,9,9,9},//9
{0,7,7,7,8,8,8,9,9,9},//10
};
- 输入的再加上这一句
ge[vis[i][j]][x]= ???;//自己写判断条件
中间相当于是一个嵌套的写法,自己体会一下咯!
2.输入的时候判断
for(int i = 1; i <= 9; i++){
for(int j = 1; j <= 9; j++){
scanf("%d ",&x);
a[i][j]=x; h[i][x]=1; l[j][x]=1;
ge[vis[i][j]][x]=1;
}
}
一些东西
这句话有点重要,起到了换行的作用
else if (y == 10) {y = 1; x ++;}
这道题递归的是位置,循环的是数字,所以采用了这种写法;
也比较常用,要记住
AC code
#include<bits/stdc++.h>
using namespace std;
int vis[11][11]={
{0,0,0,0,0,0,0,0,0,0},//1
{0,1,1,1,2,2,2,3,3,3},//2
{0,1,1,1,2,2,2,3,3,3},//3
{0,1,1,1,2,2,2,3,3,3},//4
{0,4,4,4,5,5,5,6,6,6},//5
{0,4,4,4,5,5,5,6,6,6},//6
{0,4,4,4,5,5,5,6,6,6},//7
{0,7,7,7,8,8,8,9,9,9},//8
{0,7,7,7,8,8,8,9,9,9},//9
{0,7,7,7,8,8,8,9,9,9},//10
};
int a[10][10],x,fl;
bool h[11][11],l[11][11],ge[11][11];
void dfs(int x,int y){
if(x == 9 && y==10){
for(int i = 1 ; i <= 9; i ++){
for(int j = 1; j <= 9; j++){
printf("%d ",a[i][j]);
}
cout<<endl;
}
fl=1;
return;
}
else if (y == 10) {y = 1; x ++;}
if (a[x][y]!=0) {dfs(x,y+1);}
else {
for(int i = 1; i <= 9; i ++){
if(h[x][i]==0 && l[y][i]==0 && ge[vis[x][y]][i]==0){
a[x][y]=i;
h[x][i]=1;
l[y][i]=1;
ge[vis[x][y]][i]=1; //打标记
dfs(x,y+1);
a[x][y]=0;
h[x][i]=0;
l[y][i]=0;
ge[vis[x][y]][i]=0; //回溯
if(fl==1) return;
}
}
}
}
int main() {
for(int i = 1; i <= 9; i++){
for(int j = 1; j <= 9; j++){
scanf("%d ",&x);
a[i][j]=x; h[i][x]=1; l[j][x]=1;
ge[vis[i][j]][x]=1;
}
}
dfs(1,1);
return 0;
}