1. 火柴拼接
LC:200题
给一串数组,问这些数能否组成正方形。
思路:
副中心点寻找策略:将中心点加到每条边上面,每个边加上数又称为新的副中心点,形成新的递归策略。
class Solution {
private boolean dfs(int[] nums,int i,int l1,int l2,int l3,int l4,int sum){
// 拼接火柴的策略
if(i == nums.length){
if(l1 == sum && l2 == sum && l3 == sum && l4 == sum)
return true;
else
return false;
}
if(l1 > sum || l2 > sum || l3 > sum || l4 > sum){
return false;
}
return dfs(nums,i+1,l1+nums[i],l2,l3,l4,sum) || dfs(nums,i+1,l1,l2 + nums[i],l3,l4,sum)|| dfs(nums,i+1,l1,l2,l3 + nums[i],l4,sum) || dfs(nums,i+1,l1,l2,l3,l4 + nums[i],sum);
}
public boolean makesquare(int[] nums) {
if(nums.length == 0)
return false;
int sum = 0;
for(int i : nums){
sum += i;
}
if(sum % 4 != 0)
return false;
int l1 = 0,l2 = 0,l3 = 0,l4 = 0;
return dfs(nums,0,l1,l2,l3,l4,sum/4);
}
}
LC:51题
N皇后问题。
分析:这个题的递归策略是写出来了,但是漏掉了对角线上的标记访问问题。
class Solution {
List<List<String>>result = new ArrayList<>();
List<String>ans = new ArrayList<>();
public void dfs(int n,boolean[] y,boolean[] w,boolean[] wc,StringBuffer sb,int i){
if(i == n){
result.add(new ArrayList<>(ans));
//System.out.print("进入截至条件");
return;
}
for(int j = 0;j < n;j++){
if(y[j] || w[n-1-i+j] || wc[i+j]){
continue;
}
y[j] = true;
w[n-1-i+j] = true;
wc[i + j] = true;
ans.add(new StringBuffer(sb).replace(j,j+1,"Q").toString());
dfs(n,y,w,wc,sb,i+1);
ans.remove(i);
y[j] = false;
w[n-1-i+j] = false;
wc[i+j] = false;
}
}
public List<List<String>> solveNQueens(int n) {
StringBuffer sb = new StringBuffer();
for(int i = 0;i < n;i++){
sb.append(".");
}
dfs(n,new boolean[n],new boolean[2 * n - 1],new boolean[2 * n - 1],sb,0);
return result;
}
}
原文:https://www.cnblogs.com/jihuabai/p/11754111.html