poj2676 Sudoku(DFS)

做了很久还是参考了别人的答案orz,其实也不难啊。我要开始学一下怎么写搜索了。。。

题目链接:poj2676 Sudoku

题解:暴力搜索,DFS每个空白格子所放数字。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 bool row_f[9][10];//row_f[i][j]=1表示第i行已经放了数字j
 8 bool col_f[9][10];
 9 bool block_f[9][10];
10 int g[9][9];
11 struct blank{
12     int i, j;
13     blank(int i, int j):i(i),j(j) {}
14 };
15 vector<blank> bk;
16 int get_blockid(int i, int j){
17     i /= 3;
18     j /= 3;
19     return i * 3 + j;
20 }
21 bool ok(int i, int j, int x){
22     return !row_f[i][x] && !col_f[j][x] && !block_f[get_blockid(i, j)][x];
23 }
24 void setnum(int i, int j, int x, int f){
25     row_f[i][x] = f;
26     col_f[j][x] = f;
27     block_f[get_blockid(i, j)][x] = f;
28 }
29 bool dfs(int n){//处理前n个空白格
30     if(n < 0) return true;
31     int r = bk[n].i;
32     int c = bk[n].j;
33     for(int x = 1; x <= 9; ++x){
34         if(ok(r, c, x)){
35             setnum(r, c, x, 1);
36             g[r][c] = x;
37             if(dfs(n - 1)) return true;
38             setnum(r , c, x, 0);
39         }
40     }
41     return false;
42 }
43 int main(){
44     int t, i, j;
45     char c;
46     scanf("%d", &t);
47     while(t--){
48         bk.clear();
49         memset(row_f, 0, sizeof(row_f));
50         memset(col_f, 0, sizeof(col_f));
51         memset(block_f, 0, sizeof(block_f));
52         for(i = 0; i < 9; ++i){
53             for(j = 0 ;j < 9; ++j){
54                 cin >> c;
55                 g[i][j] = c - ‘0‘;
56                 if(!g[i][j])
57                     bk.push_back(blank(i, j));
58                 else
59                     setnum(i, j, g[i][j], 1);
60             }
61         }
62         if(dfs(bk.size()-1)){
63             for(i = 0; i < 9; ++i){
64                 for(j = 0; j < 9 ; ++j)
65                     printf("%c", g[i][j] + ‘0‘);
66                 printf("\n");
67             }
68         }
69     }
70     return 0;
71 }

时间: 2024-11-01 09:44:05

poj2676 Sudoku(DFS)的相关文章

poj 2676 Sudoku (dfs)

链接:poj 2676 题意:给定一个未完成的数独,0是待填位置,其他均为已填入的数字.如果能将其 补充完整,则输出补充完整的数独(有多组答案输出任意一组),否则原样输出 数独:一个9行9列的网格,包括9个3*3的子网格,要求每行.每列.每个子网格内 都只能使用一次1-9中的一个数字, 即每行.每列.每个子网格内都不允许出现相同的数字. 分析:对于每一个未填的格,依次判断它所在行.列.子网格是否填了1-9, 若都未填,先填上该值,继续搜索, 若无法填写了,再回溯,填上其他可能的值,继续搜索 看别

poj2676 Sudoku(搜索)

题目链接:http://poj.org/problem?id=2676 题意:9*9的方格,0代表没数字,其他代表数字,请在格子中填入1~9的数字,使得在每行,每列和每个3*3的方块中,1~9的数字每个都出现一次. 如果解不唯一输出任意一组即可. 思路:只要满足上诉条件,暴力搜就可以通过了. 代码: #include<iostream> #include<cstring> using namespace std; int mp[10][10]; ///九宫格 int row[10]

poj Sudoku(数独) DFS

Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13665   Accepted: 6767   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.

POJ 3087 Shuffle&#39;m Up (DFS)

题目链接:Shuffle'm Up 题意:有a和b两个长度为n的字符序列,现定义操作: 将a.b的字符交叉合并到一个序列c,再将c最上面的n个归为a,最下面n个归为b 给出a,b和目标序列c,问最少多少次操作a.b转化为c 解析:将a.b放入哈希表,然后模拟操作过程直接dfs即可. AC代码: #include <cstdio> #include <iostream> #include <cstring> #include <map> using names

LeetCode Subsets (DFS)

题意: 给一个集合,有n个互不相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: DFS方法:由于集合中的元素是不可能出现相同的,所以不用解决相同的元素而导致重复统计. 1 class Solution { 2 public: 3 vector<vector<int>> subsets(vector<int>& nums) { 4 sort(nums.begin(),nums.end()); 5 DFS(0,nums,tmp); 6 return a

POJ 1699 Best Sequence(DFS)

題目鏈接 題意 : 將幾個片段如圖所示方法縮成一個序列,求出最短這個序列. 思路 : 其實我也不知道怎麼做.....看網上都用了DP.....但是我不會.....這個DP不錯,還有用KMP+状压DP做的 1 //1699 2 #include <iostream> 3 #include <stdio.h> 4 #include <string.h> 5 #include <string> 6 7 using namespace std; 8 9 string

LeetCode Subsets II (DFS)

题意: 给一个集合,有n个可能相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: 看这个就差不多了.LEETCODE SUBSETS (DFS) 1 class Solution { 2 public: 3 vector<vector<int>> subsets(vector<int>& nums) { 4 sort(nums.begin(),nums.end()); 5 DFS(0,nums,tmp); 6 ans.push_back(vector

poj A Knight&#39;s Journey(DFS)

题目链接:http://acm.hrbust.edu.cn/vj/index.php?c=problem-problem&id=190592 题意:给出p*q的棋盘,从(A,1)开始,走“日”字,问能否走完棋盘上所有的点,如果能,按字典序输出路径: 思路:DFS,并保存路径即可,注意处理走的方向顺序int dir[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}}; #include <stdio.h> #in

11218 - KTV(dfs)

问题 C: Repeat Number 时间限制: 1 Sec  内存限制: 128 MB 提交: 23  解决: 7 [提交][状态][论坛] 题目描述 Definition: a+b = c, if all the digits of c are same ( c is more than ten),then we call a and b are Repeat Number. My question is How many Repeat Numbers in [x,y]. 输入 There