方格填数
在2行5列的格子中填入1到10的数字。 要求: 相邻的格子中的数,右边的大于左边的,下边的大于上边的。
如【图1.png】所示的2种,就是合格的填法。
请你计算一共有多少种可能的方案。
此题用回溯法解,最简单不过了
package 第六届;
public class Exe50 {
static int sum =
0;
public static void main(String[] args) {
int num[] =
new int[
10];
for (
int i =
0; i < num.length; i++) {
num[i] = i+
1;
}
dfs(num,
0);
System.
out.println(
"总共"+sum+
"种");
}
private static void dfs(
int[] num,
int begin) {
if (begin>=num.length) {
check(num);
return ;
}
for (
int i = begin; i < num.length; i++) {
int temp = num[begin];
num[begin] = num[i];
num[i] = temp;
dfs(num,begin+
1);
temp = num[begin];
num[begin] = num[i];
num[i] = temp;
}
}
private static void check(
int[] num) {
int count =
0;
int now[][] =
new int[
2][
5];
for (
int i =
0; i < now.length; i++) {
for (
int j =
0; j < now[i].length; j++) {
now[i][j] = num[count++];
}
}
for (
int i =
0; i < now.length; i++) {
for (
int j =
0; j < now[i].length-
1; j++) {
if (now[i][j]> now[i][j+
1]) {
return ;
}
}
}
for (
int j =
0; j < now[
0].length; j++) {
if (now[
0][j]> now[
1][j]) {
return ;
}
}
System.
out.println(
"第"+(++sum)+
"种:");
for (
int i =
0; i < now.length; i++) {
for (
int j =
0; j < now[i].length; j++) {
System.
out.print(now[i][j]+
"\t");
}
System.
out.println();
}
System.
out.println(
"\n\n");
}
}
打赏一点钱,帮我买杯咖啡,继续创作,谢谢大家!