/* 首先将数据结构简化: 0 0 1 2 1 2 3 4 5 3 4 5 6 7 8 9 6 7 8 9 可以看出基础数据可以用二维数组存放,然后再思考怎样的递归形式? 发现在每一个节点,有0-9(选择其中可行的解)的解,即这些节点具有相同的解法,所以可以写成递归法 这里递归的路线是从左到右 ,从上到下(节点 0,1,2,3,4,5,6,7,8,9)每个节点为一层递归; 终止条件: 当递归到 i==4||j==4 时得到一个解。 */ #include<iostream> using namespace std; const int dir[2][2]={-1,-1,-1,0};//方向,分别是左上和正上 int v[10]; //标记v[i]中的数字i是否访问过 int a[4][4]; //存放三角形数据 int ans; //解数量 /* 判断 i,j下标在a[i][j]没越界 return 1:没越界 0:越界 */ int inside(int i,int j){ if(i>=0&&i<=3&&j>=0&&j<=i){ return 1; } return 0; } void dfs(int i,int j){ if(i==4||j==4){ ans++; return; } for(int k=0;k<=9;k++){ if(v[k])continue; //若数字 k 访问过则跳过 k int flag_a=1; //判断数字 k 是否可以分配给 a[][]. for(int h=0;h<2;h++){ int ii=i+dir[h][0];int jj=j+dir[h][1]; int flag_in=inside(ii,jj); if(flag_in&&a[ii][jj]>k){ flag_a=0; break; } } if(flag_a){ // k 可分配 a[i][j]=k; v[k]=1; //选择下标(i_temp,j_temp)为下一个节点进行递归 int i_temp=i;int j_temp=j; if(i==j){ i_temp++;j_temp=0; }else if(j<i){ j_temp++; } dfs(i_temp,j_temp); //注意还原以下变量 v[k]=0; a[i][j]=0; } } } int main(){ dfs(0,0); cout<<ans<<endl; return 0; }
//有疑问建议的同学,欢迎在下方发言评论
搭积木
最新推荐文章于 2021-03-27 08:55:59 发布