poj2676Sudoku
来源:互联网 发布:蚁群算法公式解析 编辑:程序博客网 时间:2024/05/29 21:30
Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure. In some of the cells are written decimal digits from 1 to 9. The other cells are empty. The goal is to fill the empty cells with decimal digits from 1 to 9, one digit per cell, in such way that in each row, in each column and in each marked 3x3 subsquare, all the digits from 1 to 9 to appear. Write a program to solve a given Sudoku-task.
The input data will start with the number of the test cases. For each test case, 9 lines follow, corresponding to the rows of the table. On each line a string of exactly 9 decimal digits is given, corresponding to the cells in this line. If a cell is empty it is represented by 0.
For each test case your program should print the solution in the same format as the input data. The empty cells have to be filled according to the rules. If solutions is not unique, then the program may print any one of them.
1103000509002109400000704000300502006060000050700803004000401000009205800804000107
143628579572139468986754231391542786468917352725863914237481695619275843854396127
#include<iostream>#include<string.h>using namespace std;int map[10][10]; //九宫格bool row[10][10]; //row[i][x] 标记在第i行中数字x是否出现了bool col[10][10]; //col[j][y] 标记在第j列中数字y是否出现了bool grid[10][10]; //grid[k][x] 标记在第k个3*3子格中数字z是否出现了bool DFS(int x,int y){ if(x==10) return true; bool flag=false; if(map[x][y]) { if(y==9) flag=DFS(x+1,1); else flag=DFS(x,y+1); if(flag) //回溯 return true; else return false; } else { int k=3*((x-1)/3)+(y-1)/3+1; for(int i=1;i<=9;i++) //枚举数字1~9填空 if(!row[x][i] && !col[y][i] && !grid[k][i]) { map[x][y]=i; row[x][i]=true; col[y][i]=true; grid[k][i]=true; if(y==9) flag=DFS(x+1,1); else flag=DFS(x,y+1); if(!flag) //回溯,继续枚举 { map[x][y]=0; row[x][i]=false; col[y][i]=false; grid[k][i]=false; } else return true; } } return false;}int main(int i,int j){ int test; cin>>test; while(test--) { memset(row,false,sizeof(row)); memset(col,false,sizeof(col)); memset(grid,false,sizeof(grid)); char MAP[10][10]; for(i=1;i<=9;i++) for(j=1;j<=9;j++) { cin>>MAP[i][j]; map[i][j]=MAP[i][j]-'0'; if(map[i][j]) { int k=3*((i-1)/3)+(j-1)/3+1; row[i][ map[i][j] ]=true; col[j][ map[i][j] ]=true; grid[k][ map[i][j] ]=true; } } DFS(1,1); for(i=1;i<=9;i++) { for(j=1;j<=9;j++) cout<<map[i][j]; cout<<endl; } } return 0;}
阅读全文
0 0
- poj2676Sudoku
- poj2676Sudoku 暴搜
- POJ2676Sudoku(AC2)
- poj2676Sudoku(dfs)
- poj2676Sudoku(DFS)
- 数据库系统概率学习攻略(第8组)
- CSS把边框 border变成内边框,就是不改变宽度高度
- 高通lcd调试总结
- Forking and executing process
- 1954【线性规划与网络流24题 19】负载平衡问题
- poj2676Sudoku
- 51nod 1163 最高的奖励 (贪心+优先队列/并查集)&& 1191 消灭兔子(贪心+优先队列维护) && 1475 建设国家 (思维枚举+优先队列)
- StateList资源
- caffe过程中的错误(二)
- 2017年7月 bug总结
- Apache ab性能测试
- ArrayList在多线程调用Add()添加元素时的下标越界问题(java.lang.ArrayIndexOutOfBoundsException)
- Machine learning : Regression with one variable
- 李宏毅machine learning课程中的作业HW0