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

您所在位置: