码迷,mamicode.com
首页 > 其他好文 > 详细

Tsinsen_A1024. 瓷砖问题再讨论

时间:2015-05-14 07:32:16      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:tsinsen   a1024   瓷砖问题再讨论   递归   

问题描述
  有一长度为N(1<=N<=10)的地板,给定三种不同瓷砖:一种长度为1,一种长度为2,另一种长度为3,数目不限。要将这个长度为N的地板铺满,并且要求长度为1的瓷砖不能相邻,一共有多少种不同的铺法?在所有的铺设方法中,一共用了长度为1的瓷砖多少块?
  例如,长度为4的地面一共有如下4种铺法,并且,一共用了长度为1的瓷砖4块:
  4=1+2+1
  4=1+3
  4=2+2
  4=3+1
  编程求解上述问题。
输入格式
  只有一个数N,代表地板的长度
输出格式
  第一行有一个数,代表所有不同的瓷砖铺放方法的总数。
  第二行也有一个数,代表这些铺法中长度为1的瓷砖的总数
样例输入
4
样例输出
4

4



//#include<iostream>
//#include<cstdio>
#include<stdio.h>
//蓝色部分为调试时所写 
int ans, num;
int cnt = 0, count = 0;
void dg(int x, int n1, short flag) { 
  //问题终于找出来了,对于n1的每次增加必须在确定本次所铺的瓷砖为1时, 然后在下一次进行增加,否则会导致本次可能多次自增 
	if(x == 0 && !flag) {ans++; num += n1; /*cout << "第" << ++count << "次成功------"<< "n1: " << n1 << "出栈" << endl; */return ;} 
	else if(x == 0 && flag) {n1++; ans++; num += n1;  return ;}
	//cout <<"第" << ++cnt << "次  n1: " << n1 << "  flag: " << flag << "  ans: " << ans << endl;
	if(flag) n1++;
	for(int i = 1; i <= 3; i++) 
		if(x >= i) { // cout << "i -- " << i << endl; 
			if( i == 1 && !flag) {flag = 1;/*cout << "入栈  " ;*/dg(x-i, n1, flag);} 
			else if(i == 1 && flag) ;
			else {flag = 0; /*cout << "入栈  " ;*/dg(x-i, n1, flag);} 
		} 
//	cout << " 出栈 " << endl; 一次函数的结束会减少一个栈帧,勉强写为"出栈" 
}

int main() {
	int N;
	while(scanf("%d", &N) != EOF) {
		ans = num = 0;
		dg(N, 0, 0);
		printf("%d\n%d\n", ans, num);
	}
	return 0;
}



Tsinsen_A1024. 瓷砖问题再讨论

标签:tsinsen   a1024   瓷砖问题再讨论   递归   

原文地址:http://blog.csdn.net/czkct/article/details/45715489

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!