简单的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;}

DLX

#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相关推荐

  1. HDU1426 Sudoku Killer DFS

    点击打开链接 Sudoku Killer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  2. HDU 1476 Sudoku Killer

    Sudoku Killer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  3. Sudoku Killer(HDU-1426)

    Problem Description 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行 ...

  4. 杭电oj 1426 Sudoku Killer(深度优先搜索 回溯)

    Sudoku KillerTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...

  5. HDU 1426 Sudoku Killer【DFS 数独】

    自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视.  据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品 ...

  6. HDU 1426 Sudoku Killer

    数独(DFS). 非常忧伤的一道题,先是剪枝的三个数组开成[9][9]导致 越界了WA. 然后就是每两组输出之间有空行,可是最后一组后面不能输出空行.PE好多次. #include<cstdio ...

  7. 搜索 —— 深度优先搜索(DFS)

    [概述] 深度优先搜索,是从初始状态起,利用一定的规则生成搜索树,寻找下一层任一个结点,检查是否出现目标状态,若未出现,以此状态利用规则生成再下一层任一个结点,再检查,重复过程一直到叶节点(即不能再生 ...

  8. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  9. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

最新文章

  1. 黑马程序员 交通灯案例
  2. (以pytorch为例)路径(深度)的正则化方法的简单理解-drop path
  3. python三十:time模块
  4. Zookeeper应用场景理解
  5. iOS 导航栏实现总结
  6. 地理标志农产品数据发布 特色产业对话农民丰收节交易会
  7. 超完整的 Chrome 浏览器客户端调试大全
  8. 浅析BMP位图文件结构(含Demo)[转]
  9. maven添加sqlserver的jdbc驱动包
  10. 6to4隧道实验(华为设备)
  11. VS编译器 :LNK链接错误汇总:LNK2001 / LNK2005 / LNK2019 / LNK1120
  12. python 学生编程--3 多彩同心圆
  13. 【全网世界区划最全整理输出之第一部分】全世界所有国家的行政区划整理,省市信息,已按照国家,省,市排好序,可直接复制使用,第一部分4006条,总条数:21088
  14. python画圆及其内接多边形_用Shapely求多边形的最大内接矩形
  15. 一、PS是PhotoShop的缩写
  16. 社会工程攻击——setoolkit使用(含错误解决)
  17. ASP.NET的图片上传和显示
  18. Backdoor.Trojan专杀工具
  19. 建设银行 企业公帐 操作思路
  20. [附源码]java毕业设计电子病历信息管理系统

热门文章

  1. Spark读Hive分区表报错:Caused by: org.apache.hadoop.mapred.InvalidInputException: Input path does not exist
  2. 知识图谱特征学习算法
  3. 几维安全:千锤百炼,锻造移动游戏安全防护黄金铠甲
  4. Linux学习6之软件包管理--yum在线管理
  5. You have not concluded your merge (MERGE_HEAD exists) git拉取失败
  6. 达沃斯讨论最大的技术革命机会
  7. gridpanel select选中行方法
  8. Matrix67:漫话中文分词算法
  9. ViT (Vision Transformer) ---- SimpleRNN + Self-Attention
  10. php对接小程序获取表单,PHP实现微信小程序用户授权的工具类