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
代码:
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;
    }
}

 

posted @ 2018-02-04 15:46  henu小白  阅读(264)  评论(0编辑  收藏  举报