輸入 n 階方陣,判斷是否為拉丁方陣(每行每列包含 1..n 各一次),進一步判斷是否為標準拉丁方陣(首行首列按 1..n 遞增)。
import java.util.*;
public class LatinSquare {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.print("階數 n (0退出): ");
int n = sc.nextInt();
if (n <= 0) break;
int[] a = new int[n * n];
for (int i = 0; i < n * n; i++) a[i] = sc.nextInt();
boolean latin = checkLatin(n, a);
boolean standard = latin && checkStandard(n, a);
if (standard) System.out.println("2 - 標準拉丁方陣");
else if (latin) System.out.println("1 - 拉丁方陣");
else System.out.println("0 - 非拉丁方陣");
}
}
static boolean checkLatin(int n, int[] a) {
// 檢查元素範圍 1..n
boolean[] seen = new boolean[n + 1];
int sum = 0;
for (int i = 0; i < n; i++) {
int v = a[i];
if (v < 1 || v > n || seen[v]) return false;
seen[v] = true;
sum += v;
}
// 行列和驗證
for (int i = 0; i < n; i++) {
int rowSum = 0, colSum = 0;
for (int j = 0; j < n; j++) {
int rv = a[i * n + j];
int cv = a[j * n + i];
if (rv < 1 || rv > n || cv < 1 || cv > n) return false;
rowSum += rv;
colSum += cv;
}
if (rowSum != sum || colSum != sum) return false;
}
return true;
}
static boolean checkStandard(int n, int[] a) {
// 首行 1..n
for (int j = 0; j < n; j++) if (a[j] != j + 1) return false;
// 首列 1..n
for (int i = 0; i < n; i++) if (a[i * n] != i + 1) return false;
return true;
}
}