搭积木

/*
	首先将数据结构简化:
	  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;
}

//有疑问建议的同学,欢迎在下方发言评论大笑



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值