最小タイル パス問題の簡単な概要と詳細なコードの説明 (貪欲なアルゴリズム)

1. 問題の説明

 

2.シーン構築

請負業者のシャオ・リウが道路を舗装しようとしていました.建設現場は一連のレンガを与えました.これらのレンガはさまざまな長さでした.道路は固定されており、レンガは間違いなく舗装できるはずです.各レンガの位置レンガは道を舗装しました。

 

3.貪欲な戦略選択

ここで、建設現場から渡されたレンガが、レンガの開始位置に従って左から右に配置されているとします (数軸の値は低い方から高い方です)。また、レンガの長さも低い方から配置されています。高へ (つまり、X = ln で l1 <= l2 <= ... <、li = li+1、ui <= ui+1 の場合)

Xiao Liu は、この方法を使用して道を開くことにしました。

毎回選択されたブリックは、前のブリックに接続されることが保証されます

前進する道を開くことができるより多くのレンガを優先する

 

4. コードとコメントの詳細な説明

X[7][2] = { {1,2},{1,6},{2,7},{4,8},{7,9},{8, 10} として例を示します。 ,{9,10}}

出力結果を次の図に示します。

最小タイル パス、最小タイル パスの長さによって選択されたレンガをそれぞれ出力します。

以下、コードとコメント

#include <cstdlib>
#include <cstdio>
#include <iostream>

using namespace std;

// 贪心策略:
// 每次选择的砖块,在保证能和前一块砖块连接的基础上
// 尽量选择往前铺的路更多的

int Min_road(double X[][2], int size){
    int new_road = 0;                           // 最新的被选进最小平铺路径的砖块下标
    double cover_end = X[0][0];                 // 目前路径铺到哪里了(工程进度)
    int search = 0;                             // 找到第几块地砖了(目前遍历到的地砖下标)
    int count = 0;                              // 目前最小平铺路径中的地砖数量
    int X_length = size;
    

    // 遍历地砖,寻找最小平铺路径的地砖
    while(search < X_length){

        double blank_coverage = 0;              // 选择的地砖能再往前铺多少长度的路
        int bc_record = new_road;               // 选择的地砖的下标

        for(; search<X_length && X[search][0]<=cover_end; search++){    // 找的地砖开始不能和前一块脱节,就退出本次查找
            if(X[search][1]-X[new_road][1]>=blank_coverage){            // 如果当前地砖铺的路更多
                blank_coverage = X[search][1]-X[new_road][1];           // 记录这块地砖以及它铺的路的长度
                bc_record = search;
            }
        }

        new_road = bc_record;                   // 将地砖纳入最小平铺路径
        cover_end = X[new_road][1];             // 更新工程进度
        count++;                                // 更新砖块数量

        cout << "[" << X[new_road][0] << ", " << X[new_road][1] << "]  "; 

        if (X[new_road][1] == X[size-1][1])     // 路铺完了,立即结束工程
            break;
    }

    return count;
}

int main(){
    double X[7][2] = {
   
   {1,2},{1,6},{2,7},{4,8},{7,9},{8,10},{9,10}};
    int count = Min_road(X, 7);
    cout << '\n' << "长度为:" << count;
}

 

おすすめ

転載: blog.csdn.net/m0_56942491/article/details/124255485