nyoj 722 递归深搜
2016-05-24 16:46
225 查看
深搜用到递归,必有回溯,本体很好的利用了深搜回溯的性质,对数进行排列时可以回过头来纠错
#include<stdio.h> #include<string.h> int flag; int map[9][9]; int can(int number,int x,int y) { int i,j; for(i=0;i<9;i++) { if(number==map[i][y]) return 0; } for(j=0;j<9;j++) { if(number==map[x][j]) return 0; } int a=x/3*3,b=y/3*3; for(i=a;i<a+3;i++) { for(j=b;j<b+3;j++) { if(map[i][j]==number) return 0; } } return 1; } void dfs(int x,int y) { if(flag==1)//退出递归出口,必须在调用之前判断,否则后果达不到你想要的效果 return ; if(x==9&&y==0)//这一步如果是最后一步 { int i,j; for(i=0;i<9;i++) { for(j=0;j<9;j++) { printf("%d ",map[i][j]); } printf("\n"); } flag=1; return ;//避免陷入下一递归调用 } if(y==9)//这一步如果是走向下一行的第一步 dfs(x+1,0); if(map[x][y]!=0)//这一步如果是有数字的一步 dfs(x,y+1); if(map[x][y]==0)//这一步如果是没有数字的一步 { int i; for(i=1;i<=9;i++) { if(can(i,x,y)) { map[x][y]=i; dfs(x,y+1); map[x][y]=0; } } } } int main() { int i,j,n; scanf("%d",&n); while(n--) { for(i=0;i<9;i++) { for(j=0;j<9;j++) { scanf("%d",&map[i][j]); } } dfs(0,0); memset(map,0,sizeof(map)); flag=0; } return 0; }
相关文章推荐
- java Swing布局管理之BoxLayout布局
- MTAS provisioning error: MTAS Provisioning Error; NE fault code: 4006. Reason:
- 如何在JSP页面显示mysql数据库内容 (二)
- Android Studio Instant Run 官方介绍翻译
- 10个创意的SVG Button 点击特效
- 社交网络中的共同好友计算(一度好友与二度好友)
- 关于322. Coin Change的解法与总结
- Android M运行时权限
- Spark中组件Mllib的学习23之随机梯度下降(SGD)
- scala中的Map初始化过程详解及隐式类型转换
- 怎么解决Ubuntu14.04不能打正确拼音
- Citrix XenServer 6.5以及XenCenter 6.5官方版
- 虚拟机解压缩文件命令
- Android Apk自动更新service(直接拿来用)
- jsp常用标签
- Jmeter内置脚本录制功能的使用
- 由Maven管理jar文件找不到而引出的问题java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRunt
- scala中的字段和成员方法的底层class字节文件分析
- qt+opencv程序发布
- 串行化 msgpack etc.