/// 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