回 帖 发 新 帖 刷新版面

主题:铺瓷砖问题,请指教


标题:铺瓷砖

为了让蓝桥杯竞赛更顺利的进行,主办方决定给竞赛的机房重新铺放瓷砖。机房可以看成一个n*m的矩形,
而这次使用的瓷砖比较特别,有两种形状,如【图1.png】所示。在铺放瓷砖时,可以旋转。
 
主办方想知道,如果使用这两种瓷砖把机房铺满,有多少种方案。


两种瓷砖的形状是:正代表一个方格:

1.正

   正正    

2.正

   正正

   正


【输入格式】
输入的第一行包含两个整数,分别表示机房两个方向的长度。

【输出格式】
输出一个整数,表示可行的方案数。这个数可能很大,请输出这个数除以65521的余数。

【样例输入1】
4 4
【样例输出1】
2
【样例说明1】
这两种方案如下【图2.png】所示:
 
【样例输入2】
2 6
【样例输出2】
4
【数据规模与约定】
对于20%的数据,1<=n, m<=5。
对于50%的数据,1<=n<=100,1<=m<=5。
对于100%的数据,1<=n<=10^15,1<=m<=6。
 
资源约定:
峰值内存消耗(含虚拟机) < 512M
CPU消耗  < 8000ms


请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。


自己写的代码,请问哪里错啦?

import java.util.LinkedList;
import java.util.Scanner;

public class Main{
    //区域大小
    static int height;
    static int weight;
    static int [][]arr;
    //记录种数
    static int count = 0;

    static LinkedList<Integer> set = new LinkedList<Integer>();

    //判断区域填充是否满足条件
    static boolean judge_all(){
        for(int i = 0; i < arr.length; i++){
            for(int j = 0; j < arr[i].length; j++){
                if(arr[i][j]==0){
                    return false;
                }
            }
        }

        return true;
    }

    //判断所处位置填充所指定类型的砖是否合理
    static boolean judge_type(int x, int y, int type){
        switch(type){
            case 1:{
                if(x>=1 && x<height && y>=0 && y<weight-1 && arr[x][y]==0 && arr[x][y+1]==0 && arr[x-1][y]==0){
                    return true;
                }
                return false;
            }
            case 2:{
                if(x>=0 && x<height-1 && y>=0  && y<weight-1 && arr[x][y]==0 && arr[x][y+1]==0 && arr[x+1][y]==0){
                    return true;
                }
                return false;
            }
            case 3:{
                if(x>=0 && x<height-1 && y>=1 && y<weight && arr[x][y]==0 && arr[x][y-1]==0 && arr[x+1][y]==0){
                    return true;
                }
                return false;
            }
            case 4:{
                if(x>=1 && x<height && y>=1 && y<weight && arr[x][y]==0 && arr[x][y-1]==0 && arr[x-1][y]==0){
                    return true;
                }
                return false;
            }
            case 5:{
                if(x>=1 && x<height-1 && y>=0 && y<weight-1 && arr[x][y]==0 && arr[x-1][y]==0 && arr[x+1][y]==0 && arr[x][y+1]==0){
                    return true;
                }
                return false;
            }
            case 6:{
                if(x>=0 && x<height-1 && y>=1 && y<weight-1 && arr[x][y-1]==0 && arr[x][y]==0 && arr[x][y+1]==0 && arr[x+1][y]==0){
                    return true;
                }
                return false;
            }
            case 7:{
                if(x>=1 && x<height-1 && y>=1 && y<weight && arr[x][y]==0 && arr[x][y-1]==0 && arr[x-1][y]==0 && arr[x+1][y]==0){
                    return true;
                }
                return false;
            }
            case 8:{
                if(x>=1 && x<height && y>=1 && y<weight-1 && arr[x][y]==0 && arr[x][y-1]==0 && arr[x][y+1]==0 && arr[x-1][y]==0){
                    return true;
                }
                return false;
            }
            default:{
                return false;
            }
        }
    }

    //对指定位置用指定的砖填充区域
    static void to_fill(int x, int y, int type){
        switch(type){
            case 1:{

                arr[x][y]=1;
                arr[x][y+1]=1;
                arr[x-1][y]=1;
                return;
            }
            case 2:{

                arr[x][y]=1;
                arr[x][y+1]=1;
                arr[x+1][y]=1;
                return;
            }
            case 3:{

                arr[x][y]=1;
                arr[x][y-1]=1;
                arr[x+1][y]=1;
                return;
            }
            case 4:{
                arr[x][y]=1;
                arr[x][y-1]=1;
                arr[x-1][y]=1;
                return;
            }
            case 5:{
                arr[x][y]=1;
                arr[x-1][y]=1;
                arr[x+1][y]=1;
                arr[x][y+1]=1;
                return;
            }
            case 6:{
                arr[x][y-1]=1;
                arr[x][y]=1;
                arr[x][y+1]=1;
                arr[x+1][y]=1;
                return;
            }
            case 7:{
                arr[x][y]=1;
                arr[x][y-1]=1;
                arr[x-1][y]=1;
                arr[x+1][y]=1;
                return;
            }
            case 8:{
                arr[x][y]=1;
                arr[x][y-1]=1;
                arr[x][y+1]=1;
                arr[x-1][y]=1;
                return;
            }
            default:{
                return;
            }
        }
    }

    //对指定位置清除指定砖
    static void to_clear(int x, int y, int type){
        switch(type){
            case 1:{
                arr[x][y]=0;
                arr[x][y+1]=0;
                arr[x-1][y]=0;
                return;
            }
            case 2:{
                arr[x][y]=0;
                arr[x][y+1]=0;
                arr[x+1][y]=0;
                return;
            }
            case 3:{
                arr[x][y]=0;
                arr[x][y-1]=0;
                arr[x+1][y]=0;
                return;
            }
            case 4:{
                arr[x][y]=0;
                arr[x][y-1]=0;
                arr[x-1][y]=0;
                return;
            }
            case 5:{
                arr[x][y]=0;
                arr[x-1][y]=0;
                arr[x+1][y]=0;
                arr[x][y+1]=0;
                return;
            }
            case 6:{
                arr[x][y-1]=0;
                arr[x][y]=0;
                arr[x][y+1]=0;
                arr[x+1][y]=0;
                return;
            }
            case 7:{
                arr[x][y]=0;
                arr[x][y-1]=0;
                arr[x-1][y]=0;
                arr[x+1][y]=0;
                return;
            }
            case 8:{
                arr[x][y]=0;
                arr[x][y-1]=0;
                arr[x][y+1]=0;
                arr[x-1][y]=0;
                return;
            }
            default:{
                return;
            }
        }
    }

    //深搜 回溯,查找满足条件的方案数
    static void dfs(int x, int y){
        for(int i = 1; i <= 8; i++){

            if(judge_type(x, y, i)){
                to_fill(x, y, i);

                if(y<weight-1){
                    dfs(x, y+1);
                }
                else{
                    dfs(x+1, 0);
                }

                if(x==height-1 && y==weight-1){
                    if(judge_all()){
                        count++;
                    }
                }

                to_clear(x, y, i);
            }
            else{

                if(y<weight-1){
                    dfs(x, y+1);
                }
                else{
                    dfs(x+1, 0);
                }

                if(x==height-1 && y==weight-1){
                    if(judge_all()){
                        count++;
                    }
                }
            }

        }
    }

    public static void main(String []args){
        Scanner in = new Scanner(System.in);
        weight = in.nextInt();
        height = in.nextInt();

        arr = new int[height][weight];
        dfs(0, 0);
        System.out.println("the count is :"+count);
    }
}

回复列表 (共1个回复)

沙发

你是哪位大神?学校里的参赛学生,蓝桥杯大赛我听过耶,目前比较有名气。

我来回复

您尚未登录,请登录后再回复。点此登录或注册