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 }
可以的话,记得帮我点个推荐,然后收藏+关注哟