摆火柴棍的问题,要用到所有的火柴棍,摆成一个正方形,也就是4条边长要相等。
可用多个火柴棍拼成一条边。
思路:
DFS
因为要用到所有的火柴棍,而且正方形的4条边长是相等的,边长总长度为所有火柴棍之和,
那么如果边长和不是4的倍数,直接返回false,
下面要按照每条边长为 (边长和/4)来DFS
先把火柴棍长度排序,然后从大到小搜索,
边长初始长度为0,加上火柴棍长度 > target(每条边长)时,跳过,
相同的长度也跳过。
具体例子贴个图,链接
public boolean makesquare(int[] matchsticks) {
int n = matchsticks.length;
if(n < 4) return false;
int sum = 0;
int[] edges = new int[4];
for(int len : matchsticks) {
sum += len;
}
if(sum % 4 != 0) return false;
Arrays.sort(matchsticks);
return dfs(matchsticks, edges, n-1, sum/4);
}
boolean dfs(int[] sticks, int[] edges, int index, int target) {
if(index == -1) return true;
for(int i = 0; i < 4; i ++) {
if(edges[i] + sticks[index] > target || i > 0 && edges[i] == edges[i-1]) continue;
edges[i] += sticks[index];
if(dfs(sticks, edges, index-1, target)) return true;
edges[i] -= sticks[index];
}
return false;
}