题目:
反幻方 我国古籍很早就记载着 2 9 4 7 5 3 6 1 8 这是一个三阶幻方。每行每列以及对角线上的数字相加都相等。 下面考虑一个相反的问题。 可不可以用 1~9 的数字填入九宫格。 使得:每行每列每个对角线上的数字和都互不相等呢? 这应该能做到。 比如: 9 1 2 8 4 3 7 5 6 你的任务是搜索所有的三阶反幻方。并统计出一共有多少种。 旋转或镜像算同一种。 比如: 9 1 2 8 4 3 7 5 6 7 8 9 5 4 1 6 3 2 2 1 9 3 4 8 6 5 7 等都算作同一种情况。
思路:
这道题目和第六届题二基本是一个思路
代码 :
public class LQB6fanhuanfang {
static int count;
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = {1,2,3,4,5,6,7,8,9};
fullSort(arr,0,arr.length-1);
System.out.println(count/8);//旋转4次,镜像2次,4*2=8;
}
public static void fullSort(int[] arr, int start, int end) {
// 递归终止条件
if (start == end) {
if(check(arr)){
count++;
}
return;
}
for (int i = start; i <= end; i++) {
swap(arr, i, start);
fullSort(arr, start + 1, end);
swap(arr, i, start);
}
}
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static boolean check(int arr[]){
Set<Integer> arrSet = new HashSet<>();
int a1 = arr[0]+arr[1]+arr[2];
int a2 = arr[3]+arr[4]+arr[5];
int a3 = arr[6]+arr[7]+arr[8];
int a4 = arr[0]+arr[3]+arr[6];
int a5 = arr[1]+arr[4]+arr[7];
int a6 = arr[2]+arr[5]+arr[8];
int a7 = arr[0]+arr[4]+arr[8];
int a8 = arr[2]+arr[4]+arr[6];
arrSet.add(a1);
arrSet.add(a2);
arrSet.add(a3);
arrSet.add(a4);
arrSet.add(a5);
arrSet.add(a6);
arrSet.add(a7);
arrSet.add(a8);
if(arrSet.size()==8){
return true;
}else{
return false;
}
}
}