zoukankan      html  css  js  c++  java
  • DFS(深度优先搜索遍历求合格条件总数)--07--DFS--蓝桥杯方格填数

    此题方法多种,我用规范的DFS来求解
    题目:方格填数
    如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。 
    (左右、上下、对角都算相邻)一共有多少种可能的填数方案? 
     

    输出

    请填写表示方案数目的整数。 
     1 #include <iostream>
     2 #include <vector>
     3 #include <stdio.h>
     4 #include <queue>
     5 #include <cmath>
     6 using namespace std;
     7 const int ROW = 3;
     8 const int COL = 4;
     9 
    10 int my[10] = {0};
    11 int sum = 0;
    12 int num = 10;
    13 
    14 int dd8[8][2] = {{-1,0},{1,0},{0,1},{0,-1},{-1,1},{1,1},{-1,-1},{1,-1}};
    15 int dd[4][2] = {{-1,0},{1,0},{0,1},{0,-1}};
    16 vector<vector<int> >sig[8000];
    17 vector<vector<int> >matrix(ROW,vector<int>(COL,-2));
    18 
    19 bool check(int i,int j,int number){
    20     if(my[number] == 1)
    21         return false;
    22     for(int zz = 0;zz < 8;zz++){
    23         int ii = i + dd8[zz][0];
    24         int jj = j + dd8[zz][1];
    25         if(ii < 0||jj < 0||ii >= ROW||jj >= COL)
    26             continue;
    27         if(ii == 0&&jj ==0)
    28             continue;
    29         if(ii == ROW - 1&&jj == COL - 1)
    30             continue;
    31         if(abs(matrix[ii][jj] - number) == 1)
    32             return false;
    33     }
    34     return true;
    35 }
    36 void rightload(){
    37     sig[sum] = matrix;
    38 }
    39 int checkrightload(){
    40     for(int k = 0;k < sum;k++){
    41         if(sig[k] == matrix)
    42             return 0;
    43     }
    44     return 1;
    45 }
    46 void lock(int i,int j,int k){
    47     num--;
    48     my[k] = 1;
    49     matrix[i][j] = k;
    50 }
    51 void unlock(int i,int j,int k){
    52     num++;
    53     my[k] = 0;
    54     matrix[i][j] = -2;
    55 }
    56 void dfs(int i,int j){
    57     for(int zz = 0;zz < 4;zz++){
    58         int ii = i + dd[zz][0];
    59         int jj = j + dd[zz][1];
    60         if(ii < 0||jj < 0||ii >= ROW||jj >= COL)
    61             continue;
    62         if(ii == 0&&jj ==0)
    63             continue;
    64         if(ii == ROW - 1&&jj == COL - 1)
    65             continue;
    66         if(matrix[ii][jj] == -2){
    67             for(int k = 0;k < 10;k++){
    68                 if(check(ii,jj,k) == true){
    69                     lock(ii,jj,k);
    70                     if(num == 0){
    71                         if(checkrightload() == 1){
    72                             rightload();
    73                             sum++;
    74                         }
    75                         unlock(ii,jj,k);
    76                         return;
    77                     }
    78                     else
    79                         dfs(ii,jj);
    80                     unlock(ii,jj,k);
    81 
    82                 }
    83             }
    84         }
    85     }
    86 }
    87 int main(){
    88     for(int i = 0;i < 10;i++){
    89         lock(0,1,i);
    90         dfs(0,1);
    91         unlock(0,1,i);
    92     }
    93     cout << sum <<endl;
    94     return 0;
    95 }
  • 相关阅读:
    ArcGIS自定义工具箱-列举损坏的数据源
    ArcGIS自定义工具箱-修复损坏的工作空间
    ArcGIS自定义工具箱-显示地图文档结构
    ArcGIS自定义工具箱-字段合并
    ArcGIS自定义工具箱-字段分割
    ArcGIS自定义工具箱-字段值部分替换
    [转载]ArcGIS Engine 中的多线程使用
    一个WebService Demo
    [GeoServer]Openlayers简单调用
    [ArcEngine]Geotransformation地理变换
  • 原文地址:https://www.cnblogs.com/qinqin-me/p/12258255.html
Copyright © 2011-2022 走看看