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 }

 

posted @ 2020-02-04 02:42  我只是一个码农  阅读(329)  评论(0编辑  收藏  举报