java判断44数组是否是4阶幻方_2015蓝桥杯决赛Java A组 第二题--四阶幻方
//把1~16的數字填入4x4的方格中,使得行、列以及兩個對角線的和都相等,滿足這樣的特征時稱為:四階幻方。
//
//四階幻方可能有很多方案。如果固定左上角為1,請計算一共有多少種方案。
//比如:
// 1 2 15 16
// 12 14 3 5
// 13 7 10 4
// 8 11 6 9
//
//以及:
// 1 12 13 8
// 2 14 7 11
// 15 3 10 6
// 16 5 4 9
//
//就可以算為兩種不同的方案
import java.util.LinkedList;
public class Main {
private static final int Element_NUM = 16;
private static final int ROW = 4;
private static final int COL = 4;
private static LinkedList set = new LinkedList();
private static int[][] arr = new int[ROW][COL];
private static int count = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
arr[0][0]=1;
set.add(1);
dfs(0, 1);
System.out.println(count);
}
/**
* 往數組放元素,回溯,剪枝
* @param row
* @param col
*/
private static void dfs(int row, int col) {
for (int i = 1; i <= Element_NUM; i++) {
if (!set.contains(i)) {
arr[row][col] = i;
set.add(i);
} else
continue;
//生成元素時判斷前3行是否符合條件,不符合重新生成---
if (row == 0 && col == (COL-1 )) {
if (getRowSum(0) != 34) {
//print(true);
arr[row][col]=0;
set.removeLast();
if (i==Element_NUM) {
return;
}
continue;
}
}
if (row == 1 && col == (COL - 1)) {
if (getRowSum(1) != 34) {
arr[row][col]=0;
set.removeLast();
if (i==Element_NUM) {
return;
}
continue;
}
}
if (row == 2 && col == (COL - 1)) {
if (getRowSum(2) != 34) {
arr[row][col]=0;
set.removeLast();
if (i==Element_NUM) {
return;
}
continue;
}
}
//------------------------------
if (col < COL - 1)
dfs(row, col + 1);
else if (row < ROW - 1 && col == COL - 1)
dfs(row + 1, 0);
//到達最后一個數
if (row == ROW - 1 && col == COL - 1) {
//判斷該矩陣是否符合四階幻方
if(colIsReasonable()){
count++;
}
}
set.removeLast();
}
}
/**
* 獲取某行的所有元素之和
* @param row
* @return
*/
private static int getRowSum(int row) {
int sum = 0;
for (int i = 0; i < COL; i++) {
sum += arr[row][i];
}
return sum;
}
/**
* 判斷列和斜列是否合理
* @return
*/
private static boolean colIsReasonable() {
int sum=0;
//列,向下
for (int i = 0; i < COL; i++) {
for (int j = 0; j < ROW; j++) {
sum+=arr[j][i];
}
if(sum!=34)
return false;
sum=0;
}
sum=0;
//斜列,向右下
for (int i = 0; i < COL; i++) {
sum+=arr[i][i];
}
if(sum!=34)
return false;
sum=0;
//斜列,向右上
for (int i = COL-1; i >=0; i--) {
sum+=arr[i][COL-1-i];
}
if(sum!=34)
return false;
return true;
}
}
結果:416
雖然經過剪枝,但是這個算法還是非常耗時的,大概一兩分鐘才能得出結果,這種題應該是填空題。
總結
以上是生活随笔為你收集整理的java判断44数组是否是4阶幻方_2015蓝桥杯决赛Java A组 第二题--四阶幻方的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 年轻人多的地方适合开什么店 可以考虑
- 下一篇: 索罗斯做空是什么意思