数据结构&算法-回溯算法& 贪心算法

Posted 彩色墨水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构&算法-回溯算法& 贪心算法相关的知识,希望对你有一定的参考价值。

回溯算法

概念

(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

运行结果

代码

using System;
using System.Collections.Generic;

namespace BacktrackingAlgor

    class Program
    
        static void Main(string[] args)
        

            BacktrackingAlgo algo = new BacktrackingAlgo(8);
            algo.OPt(0, 0, false);
            Console.ReadKey();
        

    
    class BacktrackingAlgo
    
        int degr;
        int[,] map;
        List<PawnPos> pawnPosList;
        /// <summary>
        /// 已收集到的数量
        /// </summary>
        int collectNum = 0;
        struct PawnPos
        
            public int x;
            public int y;

        
        public BacktrackingAlgo(int degr)
        
            this.degr = degr;
            map = new int[degr, degr];
            pawnPosList = new List<PawnPos>();
        

        bool UnitJudge(PawnPos uPos)
        
            if (uPos.x >= degr || uPos.y >= degr)
            
                return false;
            

            for (int i = 0; i < collectNum; i++)
            

                if (pawnPosList[i].x == uPos.x || pawnPosList[i].y == uPos.y || Math.Abs(pawnPosList[i].x - uPos.x) == Math.Abs(pawnPosList[i].y - uPos.y))
                
                    return false;
                
            

            return true;
        

        public void OPt(int collectx, int collecty, bool isBack)
        
            if (collectNum >= degr)
            
                Console.WriteLine("满了");
                for (int i = 0; i < pawnPosList.Count; i++)
                
                    Console.WriteLine(pawnPosList[i].x+"-"+ pawnPosList[i].y);
                
                return;
            
            else if (collectNum < 0)
            
                Console.WriteLine("失败了");
                return;
            
            PawnPos temp = new PawnPos();
            temp.x = collectx;
            if (isBack)
            
                temp.y = pawnPosList[collectx].y + 1;
                CellOpt(temp);

            
            else
            

                temp.y = collecty;
                CellOpt(temp);


            

        

        void CellOpt(PawnPos pos)
        

            if (UnitJudge(pos))//符合要求
            
                collectNum++;
                if (pos.x >= pawnPosList.Count)
                
                    pawnPosList.Add(pos);
                
                else
                
                    pawnPosList[pos.x] = pos;
                

                OPt(collectNum, 0, false);
            
            else
            
                pos.y++;
                if (pos.y < degr)
                
                    OPt(collectNum, pos.y, false);
                
                else
                
                    //  pawnPosList.Remove(pawnPosList[collectNum]);
                    collectNum--;
                    OPt(collectNum, 0, true);
                
            
        
    




参考

小白带你学—回溯算法(Back Tracking)

贪心算法

概念

所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。

内容

最短路径算法(一) Dijkstra算法(贪心算法)
请参考我之前的文章:
数据结构&算法-图最短路径
大体思路:先从0点出发,其它所有结点中,到0点权值最小的节点为A,权值为AQ,然后这个结点A所能辐射的范围的节点X,这些X结点与0点的权值为XQ,与 AQ + AXQ的权值比较,如果后者比较小,则把XQ的权值更新,然后再找这些XQ中的最小权值。直到最后。

以上是关于数据结构&算法-回溯算法& 贪心算法的主要内容,如果未能解决你的问题,请参考以下文章

数据结构&算法-回溯算法& 贪心算法

数据结构与算法

搞定大厂算法面试之leetcode精讲4.贪心

每日算法&面试题,大厂特训二十八天——第八天(递归|回溯)

每日算法&面试题,大厂特训二十八天——第七天(递归|回溯|迭代)

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 18 贪心算法