题目描述:
    你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。你要用 所有的火柴棍 拼成一个正方形。你 不能折断 任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次 。
    如果你能使这个正方形,则返回 true ,否则返回 false 。
    原题 链接:https://leetcode.cn/problems/matchsticks-to-square

    示例 1:
    输入: matchsticks = [1,1,2,2,2]
    输出: true
    解释: 能拼成一个边长为2的正方形,每边两根火柴。
    示例 2:

    输入: matchsticks = [3,3,3,3,4]
    输出: false
    解释: 不能用所有火柴拼成一个正方形。

    提示:

    1 <= matchsticks.length <= 15
    1 <= matchsticks[i] <= 108
    解题思路:
    企业微信截图_16551072426326.png

    1. public static bool makeSquareOffical(int[] matchsticks)
    2. {
    3. int tot = matchsticks.Sum();
    4. if (tot % 4 != 0)
    5. return false;
    6. int pinjun = tot / 4;
    7. Array.Sort(matchsticks);
    8. for (int i = 0, j = matchsticks.Length - 1; i < j; i++, j--)
    9. {
    10. int tmp = matchsticks[i];
    11. matchsticks[i] = matchsticks[j];
    12. matchsticks[j] = tmp;
    13. }
    14. int[] edges = new int[4];
    15. return DFS(0, matchsticks, edges, pinjun);
    16. }
    17. public static bool DFS(int index,int[] matchsticks,int[] edges,int len)
    18. {
    19. if (index == matchsticks.Length)
    20. return true;
    21. for (int i = 0; i < edges.Length; i++)
    22. {
    23. edges[i] += matchsticks[index];
    24. if (edges[i] <= len && DFS(index + 1, matchsticks, edges, len))
    25. {
    26. return true;
    27. }
    28. edges[i] -= matchsticks[index];
    29. }
    30. return false;
    31. }

    企业微信截图_16551077173931.png