数独 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, 4, 4, 4, 5, 5, 5,
11     3, 3, 3, 4, 4, 4, 5, 5, 5,
12     3, 3, 3, 4, 4, 4, 5, 5, 5,
13     6, 6, 6, 7, 7, 7, 8, 8, 8,
14     6, 6, 6, 7, 7, 7, 8, 8, 8,
15     6, 6, 6, 7, 7, 7, 8, 8, 8
16 };
17
18 int a[N][N],Line[N][N],Column[N][N],group[N][N];
19
20 int print() {
21     for(int i=0; i<N; i++) {
22         for(int j=0; j<N; j++)
23             cout<<a[i][j]+1<<" ";
24             cout<<endl;
25     }
26 }
27
28 void dfs(int x,int y) {
29     if(x == N) {
30         print();
31         return ;
32     }
33     int nxt_x = x,nxt_y = y + 1;
34     if(nxt_y == N) nxt_x = x + 1,nxt_y = 0;
35
36     if(a[x][y] >= 0) dfs(nxt_x,nxt_y);
37     else {
38         for(int i=0; i<N; i++) {
39             if(!Line[x][i] && !Column[y][i] && !group[Group[x][y]][i]) {
40                 Line[x][i] = Column[y][i] = group[Group[x][y]][i] = 1;
41
42                 a[x][y] = i;
43                 dfs(nxt_x,nxt_y);
44                 a[x][y] = -1;
45
46                 Line[x][i] = Column[y][i] = group[Group[x][y]][i] = 0;
47             }
48         }
49     }
50 }
51
52 int main() {
53     for(int i=0; i<N; i++)
54         for(int j=0; j<N; j++)
55             cin>>a[i][j], a[i][j]--;
56     for(int i=0; i<N; i++)
57         for(int j=0; j<N; j++)
58             if(a[i][j] >= 0) {
59                 Line[i][a[i][j]] = 1,
60                 Column[j][a[i][j]] = 1,
61                 group[Group[i][j]][a[i][j]] = 1;
62             }
63     dfs(0,0);
64     return 0;
65 }

思路就是纯粹的dfs,类似于八皇后的问题

时间: 2024-10-26 14:45:54

数独 dfs的相关文章

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

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.

洛谷 P1784 数独[DFS/回溯]

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

HDU 1426(数独 DFS)

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

数独(dfs解)

蒜头君今天突然开始还念童年了,想回忆回忆童年.他记得自己小时候,有一个很火的游戏叫做数独.便开始来了一局紧张而又刺激的高阶数独.蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案? 标准数独是由一个给与了提示数字的 9×9 网格组成,我们只需将其空格填上数字,使得每一行,每一列以及每一个 3×3 宫都没有重复的数字出现. 输入: * 2 6 * * * * * * * * * 5 * 2 * * 4 * * * 1 * * * * 7 * 3 * * 2 * 1 8 *

Sudoku---hdu2676(数独DFS)

http://poj.org/problem?id=2676 递归深搜 #include<stdio.h> #include<string.h> #include<algorithm> #include<stdlib.h> #include<math.h> #include<iostream> using namespace std; #define N 100 #define INF 0xffffffff #define memse

DFS &amp; BFS

1.数独 DFS 问题:用数字1-9填充该9×9的数据块,条件:空位置填数,该行.该列.该所在的3×3(黑线划分)小块,不得有重复出现的数字 思路:DFS 用三个二维数组分别存储:值为 1则说明出现过 r[i][x]  第 i 行 x 值 是否出现过 c[j][x] 第 j 列 x 值 是否出现过 b[k][x] 第 k 快(该9×9 的数独区由9块3×3的小区域组成) x 值是否出现过 :(i/3*3+j/3 这个很重要,用来判断该位置属于那个块) 定义一个结构体数组存放空点位置,每次DFS递