POJ-2676-Sudoku-DFS
2015-08-20 15:07
204 查看
题意:每行每列每个九空格数字不同,输出一种符合题意即可
思路:
DFS&暴力
正着搜跑560,反着16ms;和这个题相似的题3074,数据厉害,这个代码过不了
思路:
DFS&暴力
正着搜跑560,反着16ms;和这个题相似的题3074,数据厉害,这个代码过不了
#include<stdio.h> #include<string.h> #include<stdlib.h> int mp[10][10]; int mx[10][10]; int my[10][10]; int mk[10][10]; int cp; struct node///需要填的空 { int x; int y; }ls[85]; int dfs(int st) { int i, j; if(st == cp) { for(i = 0; i < 9; i++) { for(j = 0; j < 9; j++) { printf("%d",mp[i][j]); } printf("\n"); } return 2; } int flag = 0; for(i = 1; i <= 9; i++) { int x = ls[st].x; int y = ls[st].y; int k=3*((x)/3)+(y)/3+1; if(!mx[x][i]&&!my[y][i]&&!mk[k][i]) { mp[x][y] = i; mx[x][i] = 1; my[y][i] = 1; mk[k][i] = 1; flag = dfs(st+1); if(flag == 2) return 2;///满足条件,不再继续 mp[x][y] = 0; mx[x][i] = 0; my[y][i] = 0; mk[k][i] = 0; } } } int main() { int t; scanf("%d",&t); while(t--) { memset(mx,0,sizeof(mx)); memset(my,0,sizeof(my)); memset(mk,0,sizeof(mk)); int i, j; cp = 0; for(i = 0; i < 9; i++) { char c[15]; scanf("%s",c); for(j = 0; j < 9; j++) { mp[i][j] = c[j]-'0'; if(mp[i][j] == 0) { ls[cp].x = i; ls[cp].y = j; cp++; } int k=3*(i/3)+j/3+1; mx[i][mp[i][j]] = 1;///每行出现过的数字 my[j][mp[i][j]] = 1;///每列出现过的数字 mk[k][mp[i][j]] = 1;///每个3X3的九宫格出现过的数字 } } dfs(0); } return 0; }
相关文章推荐
- iOS系统网络抓包方法
- C#模拟PrtScn实现截屏
- SVN不错的入门
- Programming in Lua读书笔记
- iOS 访问粘贴板
- Android(java)学习笔记182:Android读写数据到SD卡中
- setInterval()和setTimeout()
- Maven学习总结(九)——使用Nexus搭建Maven私服
- Eclipse 一直提示 loading descriptor for xxx 的解决方法
- webService学习记录-关于web项目配置的几点说明
- idea XML布局突然不显示了
- Firefox Developer Edition已阻止此网站安装未经验证的附加组件的解决办法
- 桃7
- Linux 下 gcc 与 g++的差别
- iphone手机上的抓包流程和原理概述
- MyEclipse10破解后将工程导成war包时报错
- setInterval()和setTimeout()
- ASP.NET-get与post模式的区别
- Hadoop之文件系统Shell
- Maven学习总结(八)——使用Maven构建多模块项目