1:方格填数
解题思路:首先把这两行当作1行(数据较少的时候),表示1-10;然后全排列这些1-10,然后再用条件判断符合不。
package 国赛第6届;
public class 方格填数 {
public static int a[]= {1,2,3,4,5,6,7,8,9,10};//表示数组
public static int sum=0;//表示总数
public static void p(int a[],int k) {
if(k==9) {//全排列的条件
if(pp(a)) {
sum++;
}
}
for(int i=k;i<9;i++) {
int t=a[k];
a[k]=a[i];
a[i]=t;
p(a,k+1);
t=a[k];//回溯
a[k]=a[i];
a[i]=t;
}
}
public static boolean pp(int a[]) {
if(a[4]>a[3]&&a[3]>a[2]&&a[2]>a[1]&&a[1]>a[0]) {
if(a[9]>a[8]&&a[8]>a[7]&&a[7]>a[6]&&a[6]>a[5]) {
if(a[9]>a[4]&&a[8]>a[3]&&a[7]>a[2]&&a[6]>a[1]&&a[5]>a[0]) {
return true;
}
}
}
return false;
}
public static void main(String[] args) {
p(a,0);
System.out.println(sum);
}
}
2:四阶幻方
题解简单的DFS
package 国赛第6届;
import java.util.*;
public class 四阶幻方 {
public static boolean bool[]=new boolean[17];
public static Set<String> set = new HashSet<String>();
public static int sum=0;
public static boolean check(int A[],int step) {
if(step >= 4)
if(A[0] + A[1] + A[2] + A[3] != 34)
return false;
if(step >= 8)
if(A[4] + A[5] + A[6] + A[7] != 34)
return false;
if(step >= 12)
if(A[8] + A[9] + A[10] + A[11] != 34)
return false;
if(step >= 13)
if(A[0] + A[4] + A[8] + A[12] != 34 || A[3] + A[6] + A[9] + A[12] != 34)
return false;
if(step >= 14)
if(A[1] + A[5] + A[9] + A[13] != 34)
return false;
if(step >= 15)
if(A[2] + A[6] + A[10] + A[14] != 34)
return false;
if(step >= 16)
if(A[3] + A[7] + A[11] + A[15] != 34 || A[0] + A[5] + A[10] + A[15] != 34)
return false;
return true;
}
public static void dfs(int a[],int k) {
if(check(a,k)==false) {
return;
}
if(k==16) {
char s[]=new char[a.length];
for(int i=0;i<a.length;i++) {
s[i]=(char)a[i];
}
set.add(new String(s));
return;
}
for(int i=2;i<=16;i++) {
if(bool[i]==false) {
bool[i]=true;
a[k]=i;
dfs(a,k+1);
bool[i]=false;
}
}
}
public static void main(String[] args) {
int a[]=new int[16];
a[0]=1;
bool[0]=true;
dfs(a,1);
System.out.println(set.size());
}
}
3:积分之谜
题解:这题直接用数学中代换就可以算出来了。或者模拟abc;
package 国赛第6届;
import java.util.Scanner;
public class 积分之谜 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(int a=0;a<=315;a++) {
for(int b=0;b<=420;b++) {
for(int c=0;c<=420;c++) {
if(3*a+7*b+c==315) {
if(4*a+10*b+c==420) {
System.out.println(a+b+c);
}
}
}
}
}
/*
* 数学方法:
* 3*a+7*b+c=315;````````````1
* 4*a+10*b+c=420;```````````2
* 2-1得
* a+3b=105;
* 4b+c=210;
* 420-2b+c=420;
* 4b+c=210;
* c=2b;
* b=35;
* c=70;
* a=0;
* */
}
}