POJ 2918 求解数独
来源:互联网 发布:奥卡姆剃刀知乎 编辑:程序博客网 时间:2024/05/22 16:46
思路:dfs,试填每个方格,当搜索的范围超过9×9时说明已经找到解
#include<cstdio>#include<string>#include<cstring>#include<iostream>#include<algorithm>using namespace std; int map[15][15], flag; bool CanPlace(int x, int y, int num){ for(int i = 1; i <= 10; i ++) if(map[x][i] == num || map[i][y] == num) return false; int row = ((x-1)/3)*3+1; int col = ((y-1)/3)*3+1; for(int i = row; i < row+3; i ++){ for(int j = col;j < col+3; j ++ ) if(map[i][j] == num) return false; } return true; }void dfs(int x, int y){ if(x == 9 && y > 9){ flag = 1; for(int i = 1; i < 10; i ++){ for(int j = 1; j < 10; j ++) printf("%d", map[i][j]); printf("\n"); } return; } if(y > 9){ x++; y = 1; } if(!map[x][y]){ for(int i = 1;i < 10; i ++){ if(CanPlace(x, y, i)){ map[x][y] = i; dfs(x, y+1); if(flag) return; map[x][y] = 0; } } }else dfs(x, y+1); }int main(){ char str[11]; int t,cnt = 0; //freopen("in.c", "r", stdin); scanf("%d", &t); while(t--){ printf("Scenario #%d:\n", ++cnt); memset(str, 0, sizeof(str)); for(int i = 0; i < 9; i ++){ scanf("%s", str); for(int j = 0; j < 9; j ++){ map[i+1][j+1] = str[j]-'0'; } } flag = 0; dfs(1, 1); puts(""); } return 0; }
0 0
- POJ 2918 求解数独
- 搜索 --- 数独求解 POJ 2676 Sudoku
- 数独游戏求解
- 求解数独
- 数独求解算法
- 求解数独
- 数独求解
- 数独算法求解
- 数独求解算法
- 数独求解程序
- HTML5 数独求解
- 数独求解算法
- 数独求解
- 数独求解
- 数独求解
- 数独求解
- 数独求解算法
- 暴力求解数独
- HDU 1247
- POJ 2955
- POJ 1651
- dfs 生成排列和组合
- POJ 3740
- POJ 2918 求解数独
- POJ 3613
- OSAL机制的ZigBee低功耗管理(CC2530)
- POJ 3070
- POJ 3233
- POJ 3842
- JAVA 大数运算
- POJ 2907
- POJ 3628 Bookshelf 2