import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static int[] a={1,2,3,4,5,6,7,8,9,10,11,12,13};
public static int count = 0;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
dfs(0);
System.out.println(count);
scan.close();
}
//递归实现全排列(深度优先)
public static void dfs(int k)
{
if (k == 12)
{//如果是13个全部参与的话这里的k==12应该变为k==13
if (judge())
count++;
return;
// !!!一次全排列
}
for (int i = k;i<=12;i++)
{
int temp = a[i];
a[i] = a[k];
a[k] = temp;
dfs(k+1);
temp = a[i];
a[i] = a[k];
a[k] = temp;//因为修改是对唯一的数组做了修改,为了不影响后续的排列,
//每一次会递归完成并回到这里时都要将交换复原
}
}
public static boolean judge(){
if (a[1] + a[2] == a[3] && a[4] - a[5] == a[6] && a[7] * a[8] == a[9]&& (a[10] / a[11] == a[12] && a[10] % a[11] == 0))
{// 必须判断余数为零
return true;}
else {return false;}
}//判断是否符合
}
上述转载至2016蓝桥杯省赛---java---A---6(寒假作业) ,但运行超时。以及回溯的for循环全排列写的更像是组合。
基于此,参考蓝桥杯-寒假作业_Monkeyhour的博客-CSDN博客
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static int[] nums = new int[20];
public static int[] used = new int[20];
public static int count = 0;
//public static int k = 1;
public static void dfs(int k){
if(k>=4&&nums[1]+nums[2]!=nums[3]){
return;
}
if(k>=7&&nums[4]-nums[5]!=nums[6]){
return;
}
if(k>=10&&nums[7]*nums[8]!=nums[9]){
return;
}
if(k>=13&&nums[10]/nums[11]==nums[12]&&nums[10]%nums[11]==0){
count++;
return;
}
for(int i=1;i<=13;i++){
{
if(used[i]==0){
nums[k]=i;
used[i]=1;
dfs(k+1);
used[i]=0;
}
}
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
dfs(1);
System.out.println(count);
scan.close();
}
}