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
    

      

  • 相关阅读:
    新装的idea需要设置的项目
    bug活动文章地址
    环形链表的问题
    IntelliJ配置jenkins服务的Crumb Data
    算法问题求数组排序后最大相邻数差
    jdk11安装以及无jre解决方法
    算法问题大数相加
    java中级技术点
    算法实现 出入栈,寻找最小值
    算法问题2的整数次幂
  • 原文地址:https://www.cnblogs.com/lxf120/p/2932018.html
Copyright © 2011-2022 走看看