/// 111 年工科賽第 5 題 /// 運算對稱矩陣以求出分割值 /// 漆家豪 於海青資訊科 2024/2/11 #define DEBUG #undef DEBUG using System; using System.Numerics; using System.Text; class Program { /// /// 讀取檔案資訊存入陣列 /// /// 檔案名稱 /// 取得檔案內容之陣列 public static double[,] readFile(string fileName) { try { fileName += (fileName.ToUpper().IndexOf(".TXT") >= 0 ? "" : ".TXT"); string[] lines = File.ReadAllLines("../../../" + fileName); int n = lines.Length; double[,] matrix = new double[n+1, n+1]; matrix[0, 0] = 1.0; for (int i = 1; i <= n; i++) { string[] values = lines[i-1].Split(' '); for (int j = 0; j < values.Length; j++) { matrix[i, j] = Convert.ToDouble(values[j]); } } for(int i = 0;i<=n; i++) { for(int j=0; j<=i; j++) { matrix[j, i] = ( i==j ? 1.0 : matrix[i,j] ); } } return matrix; } catch (Exception ex) { Console.WriteLine($"An error occurred while reading the file: {ex.Message}"); return null; } } /// /// 陣列遞移律(Transitive closure)運算 /// /// 陣列長度 /// 陣列值 static void transitiveClosure(ref double [,] matrix) { double minVal, maxVal; bool updated = true; while (updated) { updated = false; for (int x = 0; x < matrix.GetLength(0); x++) { for (int y = 0; y < matrix.GetLength(1); y++) { if (x != y) { maxVal = int.MinValue; for (int i = 0; i < matrix.GetLength(1); i++) { minVal = Math.Min(matrix[x, i], matrix[i, y]); if (minVal > maxVal) { maxVal = minVal; } } if (maxVal != matrix[x, y]) { matrix[x, y] = maxVal; updated = true; } } } } } } /// /// 取得矩陣上三角每列的極大值 /// /// 目標矩陣 /// 上三角每列的極大值存放位置 static void getMax(double[,] matrix , ref double[] maxRow) { double max; for (int i = 0; i < matrix.GetLength(0); i++) { max = int.MinValue; for (int j = i + 1; j < matrix.GetLength(1); j++) { if (matrix[i, j] > max) { max = matrix[i, j]; } } maxRow[i] = max; } } /// /// 輸出陣列內容 /// /// 2 維陣列 static void printMatrix(double[,] matrix) { for(int i=0; i