首页 > 其他 > 详细

回溯法解题过程

时间:2019-10-28 18:47:39      阅读:100      评论:0      收藏:0      [点我收藏+]

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!