zoukankan      html  css  js  c++  java
  • 探寻路径

    // 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
    

      

  • 相关阅读:
    查看资源加载各环节具体耗时的利器
    WebStorm 格式化代码快捷键
    Android 如何使edittext默认失去焦点
    html语义化练习易牛课堂代码
    html网页练习豆瓣网
    HTML前期学习总结
    视频课阶段基础知识总结
    MQ、JMS 关系的理解
    Jvm参数配置
    Java泛型
  • 原文地址:https://www.cnblogs.com/lxf120/p/2932018.html
Copyright © 2011-2022 走看看