`
scott________
  • 浏览: 21576 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
最近访客 更多访客>>
社区版块
存档分类
最新评论

poj 2676 Sudoku dfs 深搜

阅读更多

题目描述: http://poj.org/problem?id=2676

转自: http://zhangjian110518.blog.163.com/blog/static/74991703200933092722785/

题目技巧性不强,DFS过的,用时16MS。不过写的过程中要注意从后面往前搜。


/************************************************************************/
/*思路:
先从后面开始搜,也就是从第八十个开始搜
1、如果一个小的方格内已经包含了非零的数,则继续向下搜
2、如果一个小的方格内是一个零数,也就是还没有放入相应的数,则对其从零到九开始尝试
3、对每一个数的尝试,检查其合法性:在其所在的3*3方格内是否合适;在此行是否合适:在此列是否合适
4、如果经过以上条件可以的话那么这个数字就可以放在此小方格上,然后继续进行搜索。
************************************************************************/

#include <cstdio>

const int n = 9;
int board[9][9];
char ch[10];

//返回当前board[x][y]中的值是否可行
bool ok(int x, int y) {
    // 3 * 3
    for (int i = x / 3 * 3; i < x / 3 * 3 + 3; ++i) {
        for (int j = y / 3 * 3; j < y / 3 * 3 + 3; ++j) {
            if (x == i && y == j)
                continue;
            if (board[x][y] == board[i][j])        // the number has been used
                return false;
        }
    }
    int temp = board[x][y];
    // check the row
    for (int j = 0; j < n; ++j) {
        if (j == y)
            continue;
        if (board[x][j] == temp)
            return false;
    }
    // check the column
    for (int i = 0; i < n; ++i) {
        if (i == x)
            continue;
        if (board[i][y] == temp)
            return false;
    }
    return true;        // ok
}


int dfs(int location) {
    if (location == -1)
        return 1;

    if (board[location / n][location % n] != 0)        // has number
        return dfs(location - 1);
    else {
        for (int i = 1; i <= n; ++i) {      // try
            board[location / n][location % n] = i;
            if (ok(location / n, location % n)) {
                if (dfs(location - 1))
                    return 1;
            }
            board[location / n][location % n] = 0;
        }
    }
    return 0;
}

int main() {
    int nCases;
    scanf("%d", &nCases);
    while (nCases--) {
        for (int i = 0; i < n; ++i) {
            scanf("%s", ch);
            for (int j = 0; j < n; ++j) {
                board[i][j] = ch[j] - '0';
            }
        }

        dfs(80);

        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                printf("%d", board[i][j]);
            }
            printf("\n");
        }
    }

    return 0;
}

分享到:
评论

相关推荐

    POJ2676-Sudoku

    标题“POJ2676-Sudoku”指向的是北京大学在线编程平台POJ上的一道题目,编号为2676,题目内容与经典的数独游戏有关。解题报告和AC(Accepted)代码是该问题解决方案的组成部分,通常包括对问题的理解、算法设计、...

    POJ 2676 代码 搜索数独答案

    简单搜索题 数独 答案 POJ 2676 也可以没事玩玩数独。

    poj 3435 Sudoku Checker.md

    poj 3435 Sudoku Checker.md

    poj2488——dfs深度优先遍历

    poj 2488——dfs深度优先遍历 //给行数列数,求问能否遍历,给出字典序的一种遍历

    极角排序:POJ 1696(叉积+深搜)

    描述中提到的“叉积+深搜”,指的是在解决这个问题时可能用到的两种技术。叉积是向量运算的一种,用于判断两个向量的方向关系,也可以用来计算两个向量构成的角的大小。在计算几何中,叉积常用于判断点的位置关系、...

    POJ1014-Dividing【DFS】【多重背包+二进制优化】

    在给出的文件列表中,“POJ1014-Dividing【多重背包+二进制优化】.cpp”和“POJ1014-Dividing【DFS】.cpp”很可能是两份不同的C++代码实现,分别展示了如何结合多重背包和二进制优化以及如何利用DFS来解决问题。...

    POJ1020-Anniversary Cake【有技巧的DFS】

    【标题】"POJ1020-Anniversary Cake【有技巧的DFS】"是一个源自北京大学在线编程平台POJ的编程题目,它涉及到深度优先搜索(DFS)算法的应用。这道题目要求参赛者通过编程解决一个有趣的问题,即在特定条件下如何...

    POJ3733-Changing Digits【DFS+强剪枝】

    【标题】"POJ3733-Changing Digits【DFS+强剪枝】"是一个来自北京大学在线评测系统POJ的编程题目,该题目主要涉及深度优先搜索(DFS)算法和强剪枝策略。在算法竞赛和编程挑战中,这类问题通常要求参赛者通过编写...

    POJ3373-Changing Digits【DFS+强剪枝】

    标题“POJ3373-Changing Digits【DFS+强剪枝】”涉及的是一个编程竞赛中的问题,这个问题在北大POJ(北京大学在线评测系统)平台上被提出。"Changing Digits"是一个算法挑战,而解决方案是通过深度优先搜索(DFS)...

    POJ3009-Curling 2.0【DFS+Vector+回溯+剪枝】

    提供的代码文件"POJ3009-Curling 2.0【DFS+Vector+剪枝】.cpp"和"POJ3009-Curling 2.0【DFS+回溯+剪枝】.cpp"应该分别展示了如何在实际编程中应用这些技术,而"POJ3009-Curling 2.0.doc"则可能是解题报告,详细阐述...

    POJ1691-Painting A Board 【拓扑+DFS】

    【标题】"POJ1691-Painting A Board 【拓扑+DFS】"是一个源自北京大学在线编程平台POJ的编程题目,它主要涉及到图论中的拓扑排序和深度优先搜索(DFS)算法。该题目的核心是解决一个与涂色相关的实际问题,通过运用...

    图的深搜+树状数组练习 POJ 3321(JAVA)

    标题中的“图的深搜+树状数组练习 POJ 3321(JAVA)”指的是一个编程题目,其中涉及到图的深度优先搜索(DFS, Depth First Search)算法和树状数组(也称为线段树,Segment Tree)的数据结构。这个题目来源于POJ...

    POJ-2870 Light Up + DFS(1级DFS+1级DFS) + Python - 思维导图

    题目"POJ-2870 Light Up"是一个经典的图论问题,主要涉及深度优先搜索(DFS)算法的运用。该问题要求点亮一个矩形区域内的所有障碍物,每个障碍物需要特定数量的灯光才能被照亮,且相邻的障碍物之间不能有空格。题目...

    POJ算法题目分类

    * 简单搜索技巧和剪枝:简单搜索技巧和剪枝是指解决问题的简单搜索技巧和剪枝算法,如 poj2531、poj1416、poj2676、1129。 五、动态规划 动态规划是指解决问题的动态规划算法,包括背包问题、型如下表的简单 DP...

    poj题目分类

    * 简单搜索技巧和剪枝:例如 poj2531、poj1416、poj2676、poj1129。 5. 动态规划: * 背包问题:例如 poj1837、poj1276。 * 类型 DP:例如 poj3267、poj1836、poj1260、poj2533。 中级 1. 基本算法: * C++的...

    POJ 1979 Red and Black(广搜与深搜两种解答)

    标题“POJ 1979 Red and Black”是一个编程竞赛题目,主要涉及的问题是算法设计,特别是搜索算法。在这个问题中,广度优先搜索(BFS)和深度优先搜索(DFS)这两种策略被用来解决特定的红黑树相关的问题。红黑树是一...

    图的深搜+回溯练习题:POJ2197

    标题中的“图的深搜+回溯练习题:POJ2197”是指一个编程题目,主要涉及图论中的深度优先搜索(DFS, Depth First Search)和回溯算法的应用。这个题目来源于在线编程竞赛平台POJ(Problem Online Judge),编号为2197...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj2531, poj1416, poj2676, poj1129 - **解释**:状态压缩动态规划通过压缩状态空间来降低算法的时间复杂度。 ### 四、组合数学 #### 1. 组合计数 - **例题**:poj3252, poj1850, poj1019, poj1942 -...

    poj各种分类

    包括深度优先遍历(DFS)和广度优先遍历(BFS),用于探索图的所有节点,是解决许多图问题的基础,如poj1860和poj3259所示。 #### 最短路径算法 Dijkstra算法、Bellman-Ford算法和Floyd算法分别适用于无负权边、有...

Global site tag (gtag.js) - Google Analytics