POJ_2676_Sudoku
来源:互联网 发布:用友软件客服 编辑:程序博客网 时间:2024/05/23 20:37
数独,当年一家人都很疯狂的玩
如今用电脑dfs非常容易的就解决了。
判断在同一大格里可以填有点麻烦。
题目每组输入其实是9个整数,所以……
另外就是题目要求对于有多个解的题目,输出一个可行解。
#include <iostream>#include <stdio.h>using namespace std;int ss[9]; //输入这里也卡了一下int s[9][9];int f;bool cilr(int x,int y,int n) //判断是不是在同一行同一列{ for(int i=0;i<9;i++) if(n==s[x][i]||n==s[i][y]) return 0; return 1;}bool cibox(int x,int y,int n) //判断是不是在同一个小格子里{ int px,py; if(x<3) px=0; else if(x>5) px=6; else px=3; if(y<3) py=0; else if(y>5) py=6; else py=3; for(int i=px;i<px+3;i++) for(int j=py;j<py+3;j++) if(s[i][j]==n) return 0; return 1;}void shows() //打印数独{ for(int i=0;i<9;i++) { for(int j=0;j<9;j++) printf("%d",s[i][j]); printf("\n"); }}void clear() //清空数独{ for(int i=0;i<9;i++) for(int j=0;j<9;j++) s[i][j]=0;}void dfs(int x,int y){ if(f) //这个标记用来确定答案是否出现了 return; if(x==9) //数独填完了 { shows(); f=1; return; } if(s[x][y]) //已经填了x,y那么下个格子 { if(y<8) dfs(x,y+1); else dfs(x+1,0); } else { for(int i=1;i<=9;i++) { if(cilr(x,y,i)&&cibox(x,y,i)) { s[x][y]=i; //cout<<i; dfs(x,y); //cout<<"re"<<endl; //第一次总是在中间停住 } } s[x][y]=0; //这个语句很关键,最开始想的是从左向右从上到下填不会需要 } //但回退后如果后面的节点回退时没有清空会影响回退后的判断} int main(){ int t; scanf("%d",&t); while(t--) { f=0; for(int i=0;i<9;i++) scanf("%d",&ss[i]); //注意如果用读整数的方法只能读进来9个整数 for(int i=0;i<9;i++) for(int j=8;j>=0;j--) //转化为9*9格里面的数 { s[i][j]=ss[i]%10; ss[i]/=10; } dfs(0,0); clear(); } return 0;}
0 0
- POJ_2676_Sudoku
- 数据库获取系统时间与使用
- “MediaPlayer error (1, -2147483648)”的解决方法
- 暑假集训——个人训练赛04——D题
- 实现手机号的分隔显示与编辑181 6836 8565
- 在安卓端使用Jsoup解析HTML
- POJ_2676_Sudoku
- css 多行文本溢出显示省略号(…)全攻略
- 表分区MySQL版本:5.5.11比5.1查询速度明显提高(4倍左右)
- @AUTORELEASEPOOL
- 我在无限互联学习记录连载2
- JAVA测试初看。
- Leetcode 131 Palindrome Partitioning 回文分割
- Android数据存储之Assets、Raw
- 上传文件到github