我認爲你需要一個通用的方法來解決這個問題是什麼讓你的公式更通用。
對於你檢查任何一對邊的總和大於第三邊的三角形。但是如果你真的考慮這個問題,你真正需要做的就是確保最長的一面小於其他兩個的總和。如果這種情況屬實,那麼所有其他情況也是如此。
此規則也適用於四邊形或任何其他形狀。基本上我們正在做的是確保如果我們放下最長的一面,並將另一端的鏈條連接到它的一端,那麼鏈條的末端將會到達長邊的另一端。
的規則是容易測試,如果我們有確切的組數字:
return (maxValue < sumOfOtherValues);
但是,你說,你要允許邊數的比我們的對象更加測試,並返回true
如果任意它們的組合導致該對象。
在這種情況下,我建議,如果我們對物品進行排序,則會在連續的n
項目組中找到答案(其中n
就是邊數)。
其原因是我們希望儘可能短的「長」長度和最長的「短」長度,這意味着它們將被分組在一起。
鑑於此,我們可以創建以下通用方法,該方法將長度列表和要測試的對象的邊的數量。然後,我們對列表進行排序,然後連續n
項目測試組,看看第一n-1
項目的總和比nth
項目更大:
private static bool CanCreateAShapeWithSideCount(List<double> lengths, int sideCount)
{
// Validate our input
if (sideCount < 1 || lengths == null || lengths.Count(l => l > 0) < sideCount)
{
return false;
}
// Get all lengths greater than zero and sort them
var validLengths = lengths.Where(l => l > 0).OrderBy(l => l).ToList();
// Take groups of 'sideCount' size and return 'true'
// if the longest is less than the sum of the rest
for (int i = 0; i < validLengths.Count - sideCount + 1; i++)
{
var sideGroup = validLengths.Skip(i).Take(sideCount).ToList();
var maxVal = sideGroup.Max();
if (maxVal < sideGroup.Sum() - maxVal) return true;
}
// We didn't find a match, so return false
return false;
}
現在,我們可以從其他的方法調用這個通用的方法,如測試一個三角形或四邊形:
private static bool IsTriangle(double sideA, double sideB, double sideC)
{
var sides = new List<double> {sideA, sideB, sideC};
return CanCreateAShapeWithSideCount(sides, 3);
}
// Test if a quadrilateral can be created from 5 lengths
private static bool IsQuadrilateral(double sideA, double sideB,
double sideC, double sideD, double sideE)
{
var sides = new List<double> { sideA, sideB, sideC, sideD, sideE };
return CanCreateAShapeWithSideCount(sides, 4);
}
歡迎來到[so]。請查看[問]並告訴我們您嘗試了什麼。這看起來像家庭作業,[所以]不是一項家庭作業服務。 – TemporalWolf
你已經有了一個方法來測試四邊形,或者至少是測試四邊形的公式嗎?這需要先回答。另外,一個四邊形有4個邊,而不是5個。 –
嘿,TemporalWolf。這不是功課。 –