数独(dfs解)

蒜头君今天突然开始还念童年了,想回忆回忆童年。他记得自己小时候,有一个很火的游戏叫做数独。便开始来了一局紧张而又刺激的高阶数独。蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案?

标准数独是由一个给与了提示数字的 9×9 网格组成,我们只需将其空格填上数字,使得每一行,每一列以及每一个 3×3 宫都没有重复的数字出现。

输入:

* 2 6 * * * * * *
* * * 5 * 2 * * 4
* * * 1 * * * * 7
* 3 * * 2 * 1 8 *
* * * 3 * 9 * * *
* 5 4 * 1 * * 7 *
5 * * * * 1 * * *
6 * * 9 * 7 * * *
* * * * * * 7 5 *

输出:

1 2 6 7 3 4 5 9 8
3 7 8 5 9 2 6 1 4
4 9 5 1 6 8 2 3 7
7 3 9 4 2 5 1 8 6
8 6 1 3 7 9 4 2 5
2 5 4 8 1 6 3 7 9
5 4 7 2 8 1 9 6 3
6 1 3 9 5 7 8 4 2
9 8 2 6 4 3 7 5 1

提醒:两个数字之间要有一个空格,其他地方不要输出多余的符号

示例代码:

/**
    关于数组xv,yv,vv起的标记作用
    其思想其实也很简单,就是做到数独上面的格子能够和xv,yv,vv上的格子有个对应关系
    感觉深搜基本上都会用到数组标记的技巧(用来回溯)
*/
#include<cstdio>
char s[10][10]; //存储"棋盘"上的数据
bool xv[10][10], yv[10][10], vv[10][10];    //用来标记行、列、3x3格子填过数的位置
bool f;
void dfs(int x, int y) {

    if(f) {
        return;
    }

    if( x == 9 ) {      //x为9 说明所有的行都填数完毕
        f = true;
        //所有数字都已经填完,输出填完之后的数独"棋盘"
        for (int i = 0; i < 9; i ++) {
            for (int j = 0; j < 9; j ++) {

                if(j == 8) {
                    printf("%c\n",s[i][j]);
                } else {
                    printf("%c ",s[i][j]);
                }

            }
        }
        return;
    }

    if( y == 9 ) {      //y为9说明填好一行
        dfs(x + 1, 0);  //换一行继续填
        return;
    }

    if(s[x][y] != '*') {
        dfs(x, y + 1);
        return;
    }

    for(int i = 1; i <= 9; i ++) {
    //printf("%d %d %d\n",x, y, i);
        //在符合条件的位置上填数
        if(!xv[x][i] && !yv[y][i] && !vv[x / 3 * 3 + y / 3][i]) {
            xv[x][i] = yv[y][i] = vv[x / 3 * 3 + y / 3][i] = true;    //已经填过的数在对应、列、3x3方格上做好标记
            s[x][y] = i + '0';    //填入数字
            dfs(x, y + 1);
            xv[x][i] = yv[y][i] = vv[x / 3 * 3 + y / 3][i] = false;    //取消填过的数(深搜到某一步发现当前解不符合条件时需要回溯上一个dfs(int x,int y),此时需要取消历史填数以便进行其他试探)
            s[x][y] = '*';
        }
    }

}
int main() {
    //输入一个原始的数独数据
    for(int i = 0; i < 9; i ++ ) {
        for (int j = 0; j < 9; j ++) {

            scanf(" %c",&s[i][j]);  //" %c"留了一个空格是为了吃掉输入中的空格

            //将已经填好数字的位置 通过 xv yv vv数组做个标记
            if(s[i][j] != '*') {
                xv[i][s[i][j] - '0'] = true;
                yv[j][s[i][j] - '0'] = true;
                vv[i / 3 * 3 + j / 3][s[i][j] - '0'] = true;
            }
        }
    }
    dfs(0, 0);
    return 0;
}

原文地址:https://www.cnblogs.com/zhixiangshu/p/12300024.html

时间: 2024-10-10 07:12:33

数独(dfs解)的相关文章

【原创】一个基于简单剪枝的DFS解数独程序

问题来源:leetCode Sudoku Solver Write a program to solve aSudoku puzzle by filling the empty cells. Empty cells are indicated by the character *.*. You may assume that there will be only one unique solution. 问题链接: https://oj.leetcode.com/problems/sudoku-

HDU 1426 Sudoku Killer(dfs 解数独)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1426 Sudoku Killer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9804    Accepted Submission(s): 2944 Problem Description 自从2006年3月10日至11日的首届数独世界

POJ 3074&amp;&amp;2676 数独DFS

经典数独问题 用DFS模拟数独解法,找摒除解和余数解 数独解法:http://www.sudokufans.org.cn/forums/topic/8/ 2676 #include "stdio.h" #include "string.h" struct node { int x,y; int s[10]; // 对于每个空格,数字i是否可用 int sum; // 对于每个空格,一共可以填入的数字种数 }order[101]; int cnt; // 总空格数 c

poj 2918 Tudoku 数独dfs

题意: 解数独游戏. 分析: 这道数独的数独直接dfs就能过. 代码: //poj 2918 //sep9 #include<iostream> using namespace std; char s[12][12]; int board[12][12]; int CheckSquare[12][12]; int CheckRow[12][12]; int CheckColumn[12][12]; int ok; int GetSquareId(int i,int j) { int r=i/3

洛谷 P1784 数独[DFS/回溯]

To 洛谷.1784 数独类似题:CODEVS.4966 简单数独(4*4数独) CODEVS.2924 数独挑战) 题目描述 数独是根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个粗线宫内的数字均含1-9,不重复.每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的. 芬兰一位数学家号称设计出全球最难的“数独游戏”,并刊登在报纸上,让大家去挑战. 这位数学家说,他相信只有“智慧最顶尖”的人才有可能破解这个“数独之谜”.

POJ 2676 Sudoku (数独 DFS)

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14368   Accepted: 7102   Special Judge Description Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure. In some

POJ 2676 数独(DFS)

Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 21612   Accepted: 10274   Special Judge Description Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure.

HDU 1426(数独 DFS)

题意是完成数独. 记录全图,将待填位置处填 0,记录下所有的待填位置,初始化结束.在每个待填位置处尝试填入 1 - 9,若经过判断后该位置可以填入某数字,则继续向下填下一个位置, 回溯时把待填位置重新赋值为 0,总之就是深搜的思想. 要注意存数时是从 0 位置存到 8 位置,而不是从 1 位置存到 9 位置,因为这样在后面判断是否满足 3*3 的小九宫格要求时可以直接用坐标乘以 3 再除以 3 的方法到达小九 宫格的左上角位置,便于遍历小九宫格. 代码如下: 1 #include <bits/s

数独 dfs

@[email protected] 题目: (⊙v⊙)嗯,代码: 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 const int N = 9; 6 const int Group[9][9] = { 7 0, 0, 0, 1, 1, 1, 2, 2, 2, 8 0, 0, 0, 1, 1, 1, 2, 2, 2, 9 0, 0, 0, 1, 1, 1, 2, 2, 2, 10 3, 3, 3