省赛C组搭积木
import java.util.Scanner;
public class Main{
static int sum = 0;
static boolean[] vis = new boolean[10];
static int[] a = new int[10];
public static void main(String[] args) {
dfs(1);
System.out.println(sum);
}
public static void dfs(int k) {
if(k == 10){
if( a[0] < a[1] &&
a[0] < a[2] &&
a[1] < a[3] &&
a[1] < a[4] &&
a[2] < a[4] &&
a[2] < a[5] &&
a[3] < a[6] &&
a[3] < a[7] &&
a[4] < a[7] &&
a[4] < a[8] &&
a[5] < a[8] &&
a[5] < a[9]){
sum++;
}
return;
}
for(int i = 1;i<10;i++){
if(vis[i] == false){
vis[i] = true;
a[k] = i;
dfs(k+1);
vis[i] = false;
}
}
}
}
省赛A组第六题-寒假作业
import java.util.Scanner;
public class Main {
static int sum = 0;
static boolean[] vis = new boolean[14];
static int[] a = new int[14];
public static void main(String[] args) {
dfs(0);
System.out.println(sum);
}
public static void dfs(int k) {
if(k == 12){
if(a[0]+a[1] == a[2] && a[3]-a[4] == a[5] && a[6]*a[7] == a[8] && a[9]/a[10] == a[11] && a[9]%a[10] == 0 ){
sum++;
}
return;
}else if (k == 3) {
if (a[0] + a[1] != a[2]) {
return;
}
}
for(int i = 1;i<=13;i++){
if(vis[i] == false){
vis[i] = true;
a[k] = i;
dfs(k+1);
a[k] = 0;
vis[i] = false;
}
}
}
}
回溯模板
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}