华东师范大学高可信夏令营 机试

章鱼王的行宫要铺瓷砖了。

行宫中有一长度为 N(N≤30) 的地板,给定三种不同瓷砖:一种长度为1,一种长度为2,另一种长度为3,数目不限。
要将这个长度为 N 的地板铺满,并且要求任意两个相邻的瓷砖长度均不等,一共有多少种不同的铺法?在所有的铺设方法中,一共用了长度为1的瓷砖多少块?

行宫中有一长度为 N(N≤30) 的地板,给定三种不同瓷砖:一种长度为1,一种长度为2,另一种长度为3,数目不限。
要将这个长度为 N 的地板铺满,并且要求任意两个相邻的瓷砖长度均不等,一共有多少种不同的铺法?在所有的铺设方法中,一共用了长度为1的瓷砖多少块?
  例如,长度为4的地面一共有如下3种铺法,并且,一共用了长度为1的瓷砖4块:
  4=1+2+1
  4=1+3
  4=3+1
输入格式
第一行一个整数 T(T≤30),表示测试组数。

接下来 T 行,每行只有一个数 N(N≤30),代表地板的长度

输出格式
对于每一组数据第一行有一个数,代表所有不同的瓷砖铺放方法的总数。

第二行也有一个数,代表这些铺法中长度为1的瓷砖的总数

dfs方法

#include
using namespace std;

int t,n,ans,res;
int len[3]={1,2,3};
//输入 1 4 应该输出3 4 
// 1+2+1 1+3 3+1
void dfs(int step,int cnt,int flag){
	if(step==n){
		res++;
		ans = ans+cnt;
		return;
	}
	if(step>n) return;
	for(int i=0;i<3;i++){
		if(flag==len[i]) continue;  //若len[i] 与flag记录上一次的瓷砖 相同 则跳过 
		if(step+len[i]>n) continue;
		
		if(i==0) {
			dfs(step+len[i],cnt+1,len[i]);   //记录上一次的瓷砖 
		} 
		else if(i!=0){
			dfs(step+len[i],cnt,len[i]);
		}
	}
}
int main(){
    vector<int> ve;
    cin>>t;
    while(t--){
    	ans = 0;
    	res = 0;
        cin>>n;
        dfs(0,0,0);
        cout<<res<<endl<<ans<<endl;

    }

    return 0;
}

你可能感兴趣的:(prepare)