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
编程求解上述问题。
例如,长度为4的地面一共有如下4种铺法,并且,一共用了长度为1的瓷砖4块:
4=1+2+1
4=1+3
4=2+2
4=3+1
编程求解上述问题。
输入格式
只有一个数N,代表地板的长度
输出格式
第一行有一个数,代表所有不同的瓷砖铺放方法的总数。
第二行也有一个数,代表这些铺法中长度为1的瓷砖的总数
第二行也有一个数,代表这些铺法中长度为1的瓷砖的总数
样例输入
4
样例输出
4
4
4
代码:
package www.tsinsen.com; import java.util.Scanner; public class A1024 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); int n=scan.nextInt(); if(n==1) { System.out.println(1); System.out.println(1); } else{ int[] arr=fun(0,0,n,0); System.out.println(arr[1]); System.out.println(arr[0]); } } public static int[] fun(int i,int j,int n,int count) { //i用来记录上一个是不是1,j用来记录1的个数,n记录待排的长度,count表示共有几种排法 if(n<0) { return new int[] {0,0}; } if(n==0||n==1) { if(n==0) { return new int[]{j,count}; } else if(i==0) { return new int[] {j+1,count}; } else if(i==1) { return new int[] {0,0}; } } if(i==0) { int[] arr1=fun(1,j+1,n-1,1); int[] arr2=fun(0,j,n-2,1); int[] arr3=fun(0,j,n-3,1); int count1=arr1[0]+arr2[0]+arr3[0];//计算1出现的个数 int count2=arr1[1]+arr2[1]+arr3[1];//计算总共有几种排序方法 return new int[] {count1,count2}; } else if(i==1) { int[] arr1=fun(0,j,n-2,1); int[] arr2=fun(0,j,n-3,1); int count1=arr1[0]+arr2[0];//计算1出现的个数 int count2=arr1[1]+arr2[1];//计算总共有几种排序方法 return new int[] {count1,count2}; } return null; } }