【HDU5547 2015 CCPC 南阳国赛H】【DFS】Sudoku 4x4棋盘的填充
2015-11-02 00:31
302 查看
#include<stdio.h> #include<string.h> #define MS(x,y) memset(x,y,sizeof(x)) int casenum,casei; int n; char s[10][10]; bool line[4][4]; bool list[4][4]; bool sqr[4][4]; int bl[4][4]; bool dfs(int y,int x) { while(s[y][x]!='*') { if(++x==4) { x=0; if(++y==4) { for(int i=0;i<4;i++)puts(s[i]); return 1; } } } for(int i=0;i<4;i++)if(line[y][i]&&list[x][i]&&sqr[bl[y][x]][i]) { s[y][x]='1'+i; line[y][i]=list[x][i]=sqr[bl[y][x]][i]=0; if(dfs(y,x))return 1; s[y][x]='*'; line[y][i]=list[x][i]=sqr[bl[y][x]][i]=1; } return 0; } int main() { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { if(i<=1&&j<=1)bl[i][j]=0; else if(i>=2&&j>=2)bl[i][j]=3; else if(j>=2)bl[i][j]=1; else if(i>=2)bl[i][j]=2; } } scanf("%d",&casenum); for(casei=1;casei<=casenum;casei++) { MS(line,1); MS(list,1); MS(sqr,1); for(int i=0;i<4;i++) { scanf("%s",s[i]); for(int j=0;j<4;j++) { if(s[i][j]!='*') { int x=s[i][j]-'1'; line[i][x]=0; list[j][x]=0; sqr[bl[i][j]][x]=0; } } } printf("Case #%d:\n",casei); dfs(0,0); } } /* 【题意】 给你一个4*4的图形。 每个格子填上1,2,3,4 要求同行同列同区域没有重复数字。 给定一个矩形,有些格子没填,用'*'替代。 只有唯一填充方案,让你填好这个矩形。 【类型】 dfs 【分析】 这题本来就一看便是dfs,本来不过才4^16 更因为说了只有一种方案。所以暴力一些即可。 【时间复杂度&&优化】 O(4^w) 【数据】 */
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例