蓝桥杯-第七届Java语言B组-方格填数
问题
问题描述
如下的10个格子 填入0~9的数字。要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻) 一共有多少种可能的填数方案?
注意
请填写表示方案数目的整数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思考
看到这道题的第一想法是用for循环穷举法,每个数字每个格子都判断,但是发现工作量太大了。 之后采用递归,定义两个数组分别表示填入方格里的数和判断改数是否被使用过,定义一个整型数count来记录总的方案数
代码
public class Six {
public static int count =
0 ;
public static boolean isVisit[] =
new boolean[
10] ;
public static int a[][] =
new int[
3][
4] ;
public static void main(String args[]){
for(
int i =
0 ; i <
3 ; i ++){
for(
int j =
0 ; j <
4 ; j++){
a[i][j] = -
2 ;
}
}
for(
int num =
0 ; num <
10 ; num++){
isVisit[num] =
false ;
}
find(
0,
1) ;
System.out.println(count);
}
private static void find(
int i,
int j) {
if(i ==
2&&j==
3){
count++ ;
}
for(
int num =
0 ; num <
10 ;num++){
if(judge(num,i,j)&&!(isVisit[num])){
a[i][j] = num ;
isVisit[num] =
true ;
if(j==
3){
find(i+
1,
0) ;
}
else{
find(i,j+
1) ;
}
a[i][j] = -
2 ;
isVisit[num] =
false ;
}
}
}
private static boolean judge(
int num,
int i,
int j) {
if(i-
1>=
0 && (a[i-
1][j] == num+
1 || a[i-
1][j] == num-
1)){
return false ;
}
if(j-
1>=
0 && (a[i][j-
1] == num+
1 || a[i][j-
1] == num -
1)){
return false ;
}
if(i-
1>=
0 && j-
1 >=
0 && (a[i-
1][j-
1] == num+
1 || a[i-
1][j-
1] == num -
1)){
return false ;
}
if(i-
1>=
0 && j+
1 <
4 && (a[i-
1][j+
1] ==num+
1 || a[i-
1][j+
1] == num -
1)){
return false ;
}
if(j+
1<
4 && (a[i][j+
1] == num+
1 || a[i][j+
1] == num-
1)){
return false ;
}
if(i+
1<
3 && (a[i+
1][j] == num+
1 || a[i+
1][j] == num-
1)){
return false ;
}
if(i+
1<
3 && j-
1>=
0 && (a[i+
1][j-
1] == num+
1 || a[i+
1][j-
1] == num-
1)){
return false ;
}
if(i-
1<
0 && j+
1<
4 && (a[i+
1][j+
1] == num+
1 || a[i+
1][j+
1] == num-
1)){
return false ;
}
return true ;
}
}
该博客借鉴qq_33193309这位同学的方格填块博客所写的
转载请注明原文地址: https://ju.6miu.com/read-35096.html