• 探寻路径


    // Learn more about F# at http://fsharp.net
    // See the 'F# Tutorial' project for more help.
    module File1
    open System.Windows.Forms
    open System.Collections.Generic
    
    type Loc =
        |A|B|C|D
    
    let path_key a b = if a<b then (a,b) else (b,a)
    let path_key_ls (ls:Loc list) = (ls.Head,A)
    
    let pathData =[A,B,4;A,C,1;B,C,1;B,D,1;C,D,4]
    let path_Dis_map =  pathData
                        |>List.map (fun (a,b,c)->((path_key a b)),c)
                        |>Map.ofList
    path_Dis_map |> Map.toList |>printfn "%A" 
    
    //let dict = new Dictionary<string, string>()
    let path_Dis_map2 = new Dictionary< Loc*Loc , int>()
    
    //Map.tryFind
                         
    let path_map_query ls map1=
        match ls with
        |head::val1::tail->
            if ( Map.containsKey (A,head) map1) then
                map1.[(A,head)]
            else
                System.Int32.MaxValue
        |_->System.Int32.MaxValue
    
    let rec path_cdis ls=
        match ls with
        |head::a::tail->
            let dis1 = path_Dis_map.[path_key head a]
            dis1 + path_cdis(a::tail)
        |_->0
    
    
    printfn "dis = %d %d" (path_cdis [D;C;B;A]) (path_map_query [D;C;B;A] path_Dis_map)
    
    let fileterme crr value=
    
            match value with
            | (a,b,c) when a=crr -> Some(b)
            | (a,b,c) when b=crr ->Some(a)
            | _ ->None
    let findway (ls:Loc list) =
        List.choose (fileterme ls.Head) pathData
        |> List.filter (fun x-> not ( List.exists (fun i->i=x) ls))
    
    
    
    let start1 =[[A]]
    
    
    
    let rec work2 (start,pathmaps)=
        let once =
            List.collect (fun (ls)->
            let firstList = ls//List.head start
            let ways = findway firstList
            match ways with
            |[] -> []
            |_->
                let ends = List.map (fun x ->x::ls) ways
                ends
            ) start
        let map1 = pathmaps
        let Mapme = once|> List.fold (fun (acc:Map<(Loc*Loc),int>) (ls:Loc list)->
                    let k=A,ls.Head
                    let v= path_cdis ls
                    match (Map.tryFind k acc) with
                        |Some n-> 
                            if v< n then
                                Map.add k v acc
                            else
                                acc
                        |_->Map.add k v acc
                    ) map1  //
        //Mapme|>printf "Map me %A"
            
    
    
        List.filter (fun x-> match x with
                    |D::tail ->
                        printfn "Find the way %A = %d" x (path_cdis x)
                        false
                    |_->true
                    ) once |>printfn "%A"
        //裁剪路径
        let once3 = List.filter (fun (ls:Loc list)->
                    let k=A,ls.Head
                    let v= path_cdis ls
                    match (Map.tryFind k Mapme) with
                        |Some n-> 
                            if v <= n then
                                true
                            else
                                false
                        |_->true
                    ) once
                    |>  List.filter (fun (x:Loc list)-> not (D = x.Head)) 
        //once3 |> printfn ">>>>Left is %A"
        once3,Mapme
    
    let rec work1 (start,map) =
        match start with
        |[] ->()
        |_->
            let data = work2 (start,map)
            work1 data
    
    work1 (start1,path_Dis_map) |> printfn ">>>%A"
    
    [<EntryPoint>]
    let main argv =
        printfn "%A" argv
        0 // return an integer exit code
    

      

  • 相关阅读:
    RHEL7管道与重定向
    RHEL7软件包管理
    RHEL7用户管理
    RHEL7文件管理
    RHEL7文件查找
    RHEL7文件权限
    RHEL7文件归档与压缩
    RHEL7进程管理
    博客园样式美化
    flask+python页面修改密码功能
  • 原文地址:https://www.cnblogs.com/lxf120/p/2932018.html
Copyright © 2020-2023  润新知