• 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("
    ");
    67             }
    68         }
    69     }
    70     return 0;
    71 }
    View Code
  • 相关阅读:
    数据表后缀问题
    window.history.go(-1)返回且刷新页面
    mysql性能优化-慢查询分析、优化索引和配置
    从数据库、代码和服务器对PHP网站Mysql做性能优化
    什么是WEBserver? 经常使用的WEBserver有哪些?
    浅谈 C/S 和 B/S 架构
    Android常用开源项目
    csdn android视频播放器开发
    视频会议十大开源项目排行
    Android开源项目大全
  • 原文地址:https://www.cnblogs.com/GraceSkyer/p/5862081.html
Copyright © 2020-2023  润新知