hdu1426 Sudoku Killer
简单的DFS,将所有未填的位置依次保存起来,之后,对每一个未填的位置依次枚举,往下搜即可
;;
本来想用DLX的做的,hdu3111是过了,可是原先那个模板在这道题里就是超时,不解啊,换一个模板就过了、
DFS版
#include<stdio.h>struct point{int x, y;} p[81];int num, flag, map[10][10];int judge(int n, int k){int i, j, x, y;for(i = 0; i < 9; i++) {if(i != p[n].y && map[p[n].x][i] == k)return 0;if(i != p[n].x && map[i][p[n].y] == k)return 0; } x = p[n].x / 3 * 3; y = p[n].y / 3 * 3;for(i = 0; i < 3; i++)for(j = 0; j < 3; j++)if(map[x+i][y+j] == k && (i != p[n].x || j != p[n].y))return 0;return 1;}void dfs(int n){int i;if(n == num) { flag = 1;return; }for(i = 1; i < 10; i++) {if(judge(n, i)) { map[p[n].x][p[n].y] = i; dfs(n + 1);if(flag)return; map[p[n].x][p[n].y] = 0; } }return;}int main(){int i, j, t = 0;char s[2];while(scanf("%s", s) != -1) { num = flag = 0;if(s[0] == '?') p[num].x = 0, p[num++].y = 0, map[0][0] = 0;else map[0][0] = s[0] - '0';for(i = 0; i < 9; i++)for(j = 0; j < 9; j++)if(i || j) { scanf("%s", s);if(s[0] == '?') p[num].x = i, p[num++].y = j, map[i][j] = 0;else map[i][j] = s[0] - '0'; } dfs(0);if(t++) printf("\n");for(i = 0; i < 9; i++) {for(j = 0; j < 8; j++) printf("%d ", map[i][j]); printf("%d\n", map[i][8]); } }return 0;}
#include<stdio.h>#include<string.h>#define INF 1000000000const int N = 9;const int mn = N * N * N *(N * N * N * 4) + N;const int nn = N * N * N + N;int U[mn], D[mn], L[mn], R[mn], C[mn], X[mn];int H[nn], Q[nn], S[nn], vis[nn], size;int a[nn][nn], ans[nn][nn];void prepare(int r, int c){int i;for(i = 0; i <= c; i ++) { S[i] = 0; U[i] = D[i] = i; R[i] = i + 1; L[i + 1] = i; } R[c] = 0; size = c;while(r) H[r --] = -1;}void place(int &r, int &c1, int &c2, int &c3, int &c4, int i, int j, int k){ r = (i * N + j) * N + k; c1 = i * N + j + 1; c2 = N * N + i * N + k; c3 = 2 * N * N + j * N + k; c4 = 3 * N * N + ((i / 3) * 3 + j / 3) * N + k;}void link(int r, int c){ size ++; C[size] = c; S[c] ++; X[size] = r; D[size] = D[c]; U[D[c]] = size; U[size] = c; D[c] = size;if(H[r] < 0) { H[r] = size; L[size] = size; R[size] = size; }else { R[size] = R[H[r]]; L[R[H[r]]] = size; L[size] = H[r]; R[H[r]] = size; }}void remove(int c){int i, j; L[R[c]] = L[c]; R[L[c]] = R[c];for(i = D[c]; i != c; i = D[i])for(j = R[i]; j != i; j = R[j]) { U[D[j]] = U[j]; D[U[j]] = D[j]; S[C[j]] --; }}void resume(int c){int i, j;for(i = U[c]; i != c; i = U[i])for(j = L[i]; j != i; j = L[j]) { U[D[j]] = j; D[U[j]] = j; S[C[j]] ++; } R[L[c]] = c; L[R[c]] = c;}int dance(int cur){int i, j, c, temp;if(!R[0]) {for(i = 0; i < cur ;i ++) {int x = (X[Q[i]] - 1) / N / N;int y = (X[Q[i]] - 1) / N % N; ans[x][y] = (X[Q[i]] - 1) % N + 1; }return 1; } temp = INF;for(i = R[0]; i != 0; i = R[i])if(S[i] < temp) { temp = S[i]; c = i; } remove(c);for(i = D[c]; i != c; i = D[i]) { Q[cur] = i;for(j = R[i] ; j != i; j = R[j]) remove(C[j]);if(dance(cur + 1))return 1;for(j = L[i]; j != i; j = L[j]) resume(C[j]); } resume(c);return 0;}int init(){int i, j, k, r, c1, c2, c3, c4;char temp[5];if(scanf("%s", temp) != 1)return 0; a[0][0] = (temp[0] == '?' ? 0 : temp[0] - '0');for(i = 0; i < N; i ++)for(j = 0; j < N; j ++) {if(!i && !j)continue; scanf("%s", temp); a[i][j] = (temp[0] == '?' ? 0 : temp[0] - '0'); } prepare(N * N * N, N * N * 4); memset(vis, 0, sizeof(vis));for(i = 0; i < N; i ++)for(j = 0; j < N; j ++)if(a[i][j]) { place(r, c1, c2, c3, c4, i, j, a[i][j]); link(r, c1), link(r, c2), link(r, c3), link(r, c4); vis[c2] = vis[c3] = vis[c4] = 1; }for(i = 0; i < N; i ++)for(j = 0; j < N; j ++)if(!a[i][j])for(k = 1; k <= N; k ++) { place(r, c1, c2, c3, c4, i, j, k);if(vis[c2] || vis[c3] || vis[c4])continue; link(r, c1), link(r, c2), link(r, c3), link(r, c4); }return 1;}void printresult(){int i, j;for(i = 0; i < N; i ++) {for(j = 0; j < N; j ++) {if(j) printf(" "); printf("%d", ans[i][j]); } printf("\n"); }}int main(){int t = 0;while(init()) { dance(0);if(t ++) printf("\n"); printresult(); }return 0;}
转载于:https://www.cnblogs.com/nanke/archive/2012/02/22/2363678.html
hdu1426 Sudoku Killer相关推荐
- HDU1426 Sudoku Killer DFS
点击打开链接 Sudoku Killer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- HDU 1476 Sudoku Killer
Sudoku Killer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- Sudoku Killer(HDU-1426)
Problem Description 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行 ...
- 杭电oj 1426 Sudoku Killer(深度优先搜索 回溯)
Sudoku KillerTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- HDU 1426 Sudoku Killer【DFS 数独】
自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品 ...
- HDU 1426 Sudoku Killer
数独(DFS). 非常忧伤的一道题,先是剪枝的三个数组开成[9][9]导致 越界了WA. 然后就是每两组输出之间有空行,可是最后一组后面不能输出空行.PE好多次. #include<cstdio ...
- 搜索 —— 深度优先搜索(DFS)
[概述] 深度优先搜索,是从初始状态起,利用一定的规则生成搜索树,寻找下一层任一个结点,检查是否出现目标状态,若未出现,以此状态利用规则生成再下一层任一个结点,再检查,重复过程一直到叶节点(即不能再生 ...
- 【HDOJ图论题集】【转】
1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...
- 一系列图论问题[转]
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
最新文章
- 黑马程序员 交通灯案例
- (以pytorch为例)路径(深度)的正则化方法的简单理解-drop path
- python三十:time模块
- Zookeeper应用场景理解
- iOS 导航栏实现总结
- 地理标志农产品数据发布 特色产业对话农民丰收节交易会
- 超完整的 Chrome 浏览器客户端调试大全
- 浅析BMP位图文件结构(含Demo)[转]
- maven添加sqlserver的jdbc驱动包
- 6to4隧道实验(华为设备)
- VS编译器 :LNK链接错误汇总:LNK2001 / LNK2005 / LNK2019 / LNK1120
- python 学生编程--3 多彩同心圆
- 【全网世界区划最全整理输出之第一部分】全世界所有国家的行政区划整理,省市信息,已按照国家,省,市排好序,可直接复制使用,第一部分4006条,总条数:21088
- python画圆及其内接多边形_用Shapely求多边形的最大内接矩形
- 一、PS是PhotoShop的缩写
- 社会工程攻击——setoolkit使用(含错误解决)
- ASP.NET的图片上传和显示
- Backdoor.Trojan专杀工具
- 建设银行 企业公帐 操作思路
- [附源码]java毕业设计电子病历信息管理系统
热门文章
- Spark读Hive分区表报错:Caused by: org.apache.hadoop.mapred.InvalidInputException: Input path does not exist
- 知识图谱特征学习算法
- 几维安全:千锤百炼,锻造移动游戏安全防护黄金铠甲
- Linux学习6之软件包管理--yum在线管理
- You have not concluded your merge (MERGE_HEAD exists) git拉取失败
- 达沃斯讨论最大的技术革命机会
- gridpanel select选中行方法
- Matrix67:漫话中文分词算法
- ViT (Vision Transformer) ---- SimpleRNN + Self-Attention
- php对接小程序获取表单,PHP实现微信小程序用户授权的工具类