poj-2676-Sudoku-dfs(其实就是爆搜。。)
2013-01-22 19:42
253 查看
题意:
额,题意就是数独,大家都玩过,添数独。
做法:
从头往后搜数独中不存在的数,每个数都有1~9,9种情况。对于每一种情况,先看一下这个位置是否可以放这个数。
如果可以放的话,就放下去,继续搜下一个数,如果不可以,就放下一步。
注意:
注意搜到就要及时退出。否则就要超时。
还有从后往前搜是0MS,从前往后搜就是468MS。。。囧
额,题意就是数独,大家都玩过,添数独。
做法:
从头往后搜数独中不存在的数,每个数都有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(""); } } }
相关文章推荐
- POJ 2676 Sudoku 跳舞链 || dfs
- POJ-dfs-2676-Sudoku
- poj 2676 Sudoku ( dfs )
- POJ 2676 Sudoku (DFS回溯剪枝)
- Poj 2676 Sudoku[dfs]
- poj 2676 sudoku dfs
- POJ_2676 Sudoku(DFS)
- [DFS]poj 2676 Sudoku 数独问题
- POJ-2676 Sudoku(DFS)
- POJ 2676 sudoku dfs
- poj dfs之2676 Sudoku
- poj 2676Sudoku(DFS+回溯)
- DFS POJ 2676 Sudoku
- POJ-2676 Sudoku (DFS)
- [poj 2676] Sudoku DFS
- poj 2676 sudoku ( 数独)----DFS
- POJ 2676 Sudoku (DFS)
- POJ 2676 Sudoku (数独 DFS)
- POJ 2676 Sudoku (数独 DFS)
- POJ 2676 Sudoku dfs