主题:铺瓷砖问题,请指教
标题:铺瓷砖
为了让蓝桥杯竞赛更顺利的进行,主办方决定给竞赛的机房重新铺放瓷砖。机房可以看成一个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); } }