方格填数
在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");
}
}
打赏一点钱,帮我买杯咖啡,继续创作,谢谢大家!