当前位置: 代码迷 >> 综合 >> poj-2676-Sudoku-dfs(其实就是爆搜。。)
  详细解决方案

poj-2676-Sudoku-dfs(其实就是爆搜。。)

热度:39   发布时间:2023-12-19 11:28:03.0

题意:

额,题意就是数独,大家都玩过,添数独。

做法:

从头往后搜数独中不存在的数,每个数都有1~9,9种情况。对于每一种情况,先看一下这个位置是否可以放这个数。

如果可以放的话,就放下去,继续搜下一个数,如果不可以,就放下一步。

注意:

注意搜到就要及时退出。否则就要超时。

还有从后往前搜是0MS,从前往后搜就是468MS。。。囧


#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int map[10][10];
int maps[10][10];
int xlen[10][10];
int ylen[10][10];
int len[50][10];
int search(int x,int y)
{int i,j;if(x==0){for(i=1;i<=9;i++){for(j=1;j<=9;j++){maps[i][j]=map[i][j];}}return 1;}int xx,yy;if(y==1)xx=x-1,yy=9;else{xx=x;yy=y-1;}if(map[x][y])return search(xx,yy);else{for(i=1;i<=9;i++){int num=((x-1)/3+1)*10+(y-1)/3+1;if(!xlen[x][i]&&!ylen[y][i]&&!len[num][i]){map[x][y]=i;xlen[x][i]=1;ylen[y][i]=1;len[num][i]=1;if(search(xx,yy))return 1;map[x][y]=0;xlen[x][i]=0;ylen[y][i]=0;len[num][i]=0;}}}return 0;
}
int main()
{int n,i,j,a;char c;cin>>n;getchar();while(n--){memset(map,0,sizeof(map));memset(xlen,0,sizeof(xlen));memset(ylen,0,sizeof(ylen));memset(len,0,sizeof(len));for(i=1;i<=9;i++){for(j=1;j<=9;j++){cin>>c;a=c-'0';map[i][j]=a;xlen[i][a]=1;ylen[j][a]=1;len[((i-1)/3+1)*10+(j-1)/3+1][a]=1;}getchar();}int leap;leap=search(9,9);for(i=1;i<=9;i++){for(j=1;j<=9;j++){printf("%d",maps[i][j]);}puts("");}}
}