仓颉PAT程序设计 L3-037 夺宝大赛(乱走+内存超限+答案正确)

// 夺宝大赛 hunt
import std.format.*
import std.math.*
import std.collection.*
import std.console.*
import std.convert.*
import std.random.*
import std.sync.*
import std.time.*

//判断输入的字符串是否为空。
func getOrThrow(p: ?String): String{
    match (p) {
        case Some(x) => x
        case None => ""
    }
}
//判断输入的字符串是否为数字。返回真假。
func isNumber(number_string :String):Bool{
    var number_rune :Array<Rune>=number_string.toRuneArray()
    for(number in number_rune){
        if(!number.isAsciiNumber()){
            return false   
        }
    }
    return true
}

//获取输入的数字字符串。返回字符串。
func getInputNumber():String{
    var input=Console.stdIn.readln()
    let input_to_strig: Option<String> = input
    var input_to_strig_to :String=getOrThrow(input_to_strig)
    if(isNumber(input_to_strig_to)){
        return input_to_strig_to
    }
    return ""
}

//获取输入的字符串。返回字符串。
func getInputString():String{
    var input=Console.stdIn.readln()
    let input_to_strig: Option<String> = input
    var input_to_strig_to :String=getOrThrow(input_to_strig)
        return input_to_strig_to
    return ""
}

//获取m和n。m=行 x,n=列 y
func 获取_行_列(temp :String):Array<Int64>{
    // println("temp = ${temp}")
    if(temp.size>0){
    var  tempArray :Array<String> =temp.split(" ",118,)
    // println("tempArray ${tempArray}")
    // println("tempArray[0].size ${tempArray[0].size}")
    if(tempArray.size==2){
        var m:Int64=Int64.parse(tempArray[0])
        var n:Int64=Int64.parse(tempArray[1])
        if(2<m && n<=100){
            //println("m = ${m} n = ${n}")
            return [m,n]
        }
    }
    }
    return []
}

//获取网格一行数据
func 获取一行数据(temp :String,列 :Int64):Array<String>{
    if(temp.size==2*列-1){
    var  tempArray :Array<String> =temp.split(" ",118,)
    var tempA =Array<String>(列,item:"")
    for(i in 0..tempArray.size){
        tempA[i]=tempArray[i]
        //println("tempA = ${tempA[i].size}")
    }
    return tempA
    }
    return []
}
//获取网格一行数据
func 获取一行人物数据(temp :String,列 :Int64):Array<String>{
    if(temp.size==2*列-1){
    var  tempArray :Array<String> =temp.split(" ",118,)
    var tempA =Array<String>(列,item:"")
    for(i in 0..tempArray.size){
        tempA[i]=tempArray[i]
        //println("tempA = ${tempA[i].size}")
    }
    return tempA
    }
    return []
}




//测试网格数据
func 测试网格数据():ArrayList<Array<String>>{
    var 测试数据=ArrayList<Array<String>>()
    测试数据.append(["1","1","1","1","1","0","1"])
    测试数据.append(["1","1","1","1","1","0","0"])
    测试数据.append(["1","1","0","2","1","1","1"])
    测试数据.append(["1","1","0","0","1","1","1"])
    测试数据.append(["1","1","1","1","1","1","1"])
    return 测试数据
}

//测试用户数据
func 测试用户数据():ArrayList<Array<String>>{
    var 测试数据=ArrayList<Array<String>>()
    测试数据.append(["7","5"])
    测试数据.append(["1","3"])
    测试数据.append(["7","1"])
    测试数据.append(["1","1"])
    测试数据.append(["5","5"])
    测试数据.append(["3","1"])
    测试数据.append(["3","5"])
    return 测试数据

}

//判断是否有障碍
func 判断是否有障碍(行:Int64,列:Int64,网格数据:ArrayList<Array<String>>):Bool{
   // println([行,列,网格数据.size,网格数据[0].size])
    if(行<网格数据.size&&列<网格数据[0].size){
        if(网格数据[行][列]!="0"){
            return true
        }
    }    
    return false
}

//判断是否进入大本营
func 判断是否进入大本营(行:Int64,列:Int64,网格数据:ArrayList<Array<String>>):Bool{
    if(行<网格数据.size&&列<网格数据[0].size){
        if(网格数据[行][列]=="2"){
            return true
        }
    }    
    return false
}

//随机生成行走方向
func 随机生成行走方向(行:Int64,列:Int64):Array<Int64>{
    var 随机概率:Random=Random()
    // 随机概率.seed=3
    
    var 随机数:Int64=Int64.parse(随机概率.nextUInt64(4).toString())
    // println("随机数 = ${随机数}")
    // println([行,列])
    match (随机数) {
        case 0 => return [行-1,列]
                
        case 1 => return [行+1,列]

        case 2 => return [行,列-1]

        case 3 => return [行,列+1]

        case _ => return []
                  
    }
    return []
}

//开始行走,记录行走步伐。
func 行走(行: Int64,列: Int64,步数: Int64,网格数据:ArrayList<Array<String>>,累加:Int64):Int64{
    var 走一步:Array<Int64>=[行,列]
    // println("行 列 = ${行} ${列}")
    while(true){
    走一步=随机生成行走方向(行,列)
    if(走一步[0]>=0&&走一步[1]>=0&&走一步[0]<网格数据.size&&走一步[1]<网格数据[0].size){
        break
    }
    }
    
    // println("走一步 = ${走一步}")

    if(判断是否有障碍(走一步[0],走一步[1],网格数据)){

        if(判断是否进入大本营(走一步[0],走一步[1],网格数据)){
        //    println("走一步 in ${步数}= ${走一步}")
            return 步数
        }
       // println("走一步 ${步数}= ${走一步}")
        return 行走(走一步[0],走一步[1],步数+1,网格数据,累加+1)
    }
    if(累加==500){

        return 500
    }
    return  行走(行,列,步数,网格数据,累加+1)
}





//获取网格
func 获取网格(){
    //输入游戏数据
   var 数组_行_列 :Array<Int64> =获取_行_列(getInputString())
// var 数组_行_列 :Array<Int64>=[5,7]
// println("数组_行_列  = ${数组_行_列}")
   var arraylistLine=ArrayList<(Array<String>,Array<String>)>()
   var 网格数据=ArrayList<Array<String>>()
   if(!数组_行_列.isEmpty()){
    for(i in 0..数组_行_列[0]){
        网格数据.append(获取一行数据(getInputString(),数组_行_列[1]))
        // 网格数据.append(测试网格数据()[i])
        // println("网格数据 i = ${网格数据[i]}")
        
      //  var tempArray:(Array<String>,Array<String>)=(["","","",""],获取一行数据(getInputString(),arrayMandN[1]))
        //arraylistLine.append(tempArray)   
    }
   }
    // println("网格数据 2 3 = ${网格数据[2][3]}")
//    println("网格数据  = ${网格数据}")
    //输入游戏人物数据
    var 游戏人物个数:Int64=Int64.parse(getInputString())
    // println("游戏人物个数 = ${游戏人物个数}")
    // var 游戏人物个数:Int64=7
    var 测试游戏人物个数:Int64=7
        // 游戏人物个数= 测试游戏人物个数
    var 游戏人物群=ArrayList<(Array<String>,Array<String>)>()
    var arrayGamer=ArrayList<Array<String>>()
    if(游戏人物个数>0&&游戏人物个数<数组_行_列[0]*数组_行_列[1]/2){
        for (i in 0..游戏人物个数){
        // var 单个游戏人物数据:(Array<String>,Array<String>)=(["","","",""],获取一行数据(getInputString(),arrayMandN[1]))
        // println("数组_行_列[1] = ${数组_行_列[1]}")
        var 单个游戏人物数据:(Array<String>,Array<String>)=(["","","",""],获取一行数据(getInputString(),2))
        // println("单个游戏人物数据 = ${单个游戏人物数据[1]}")
       // var 单个游戏人物数据:(Array<String>,Array<String>)=(["","","",""],测试用户数据()[i])
        游戏人物群.append(单个游戏人物数据)
        // println("游戏人物群 = ${游戏人物群[i][1]}")
        //var tempGamer:Array<String> =getInputString().split(" ",118,)
       // arrayGamer.append([i.toString,tempGamer[0],tempGamer[1],"0",""])
        }
        // println("游戏人物群 完成")
    }

    //计算每个人行走的步数。
    var 统计=ArrayList<Array<Int64>>()
    for(i in 0..游戏人物群.size){
         //println("游戏人物群[i][1].toString() = ${游戏人物群[i][1][1].toString()}  ${游戏人物群[i][1][0].toString()}")
         var 最小行走步数:Int64=500
        for(_ in 0..1000){
            var 临时行走步数:Int64=行走(Int64.parse(游戏人物群[i][1][1].toString())-1,Int64.parse(游戏人物群[i][1][0].toString())-1,0,网格数据,0)
            //println("最小行走步数 = ${最小行走步数}  临时行走步数 = ${临时行走步数}")
            if(最小行走步数>临时行走步数){
                最小行走步数=临时行走步数
            }
        }
        //println("最小行走步数 = ${最小行走步数}")

    if(最小行走步数<500){
        统计.append([i,最小行走步数]) 
    }else{ 
        统计.append([-1,最小行走步数]) 
    }
    
    }
    var 判断相等:Bool=false
    for(i in 0..统计.size){
        for(j in i+1..统计.size){
            
            if(i!=j){
                //println(" 统计[j][0] = ${统计[j][0]}  统计[j][1] ${统计[j][1]}")
                if(统计[i][0]!=-1){
                if(统计[i][1]==统计[j][1]){
                    统计[j][0]=-1
                    判断相等=true
                }
            }
            }
            
        }
        if(判断相等){
            统计[i][0]=-1
            判断相等=false
        }

    }

    for(i in 0..统计.size){
        for(j in i+1..统计.size){
           // println(" 统计[j][0] = ${统计[j][0]}  统计[j][1] ${统计[j][1]}")
            if(统计[i][0]!=-1&&统计[j][0]!=-1){
                
                if(统计[i][1]>统计[j][1]){
                    统计[i][0]=-1
                }else{
                    统计[j][0]=-1
                }
            }
             
        }
      //  println(" 统计[j][0] = ${统计[i][0]}  统计[j][1] ${统计[i][1]}")
    }

    var 没有赢家:Bool = true
    for( i in 统计){
        // println("最少步数人员 = ${i}")
        if(i[0]!=-1){
            没有赢家=false
        println("最少步数人员 = ${i[0]+1} ${i[1]+1}")
        }
    }
    if(没有赢家){
        println("No winner.")
    }
    
    

}
main(){
   //println("${获取一行数据("1 2 3 2",4)}")
   // println(随机生成行走方向(1,2))
    获取网格()
    return 0
}

CJK仓颉输入法数据库是指为仓颉输入法提供收录和管理汉字字符及其相应输入码的数据库。仓颉输入法是一种用于输入中文字符的输入法,它采用了古代汉字字形和笔画的组合规则来生成每个汉字的输入码。输入码是指在键盘上输入的一组字符以唤出对应的汉字。 CJK是指"Chinese, Japanese, Korean" 的缩写,表示支持中日韩三国语言的输入法系统。因为中文输入码的设计能够应用于这三个语言,所以CJK仓颉输入法数据库也用于日语和韩语的输入。 仓颉输入法数据库包含了大量的汉字和其对应的输入码数据。这些数据可以根据仓颉输入法的规则和要求进行生成和维护。数据库中的每个汉字都对应一个输入码,通过输入码的组合方式可以准确地输入出所需的汉字。数据库的管理者会不断收录和更新汉字及其输入码,确保数据库的完整性和实用性。 仓颉输入法数据库的作用非常重要。它是仓颉输入法正常运作的基础,决定了仓颉输入法用户能够输入哪些汉字。数据库中的数据还会随着时间的推移不断增加和完善,以适应新的汉字的加入和使用需求的变化。 总之,CJK仓颉输入法数据库是一个为仓颉输入法提供汉字和输入码数据的数据库,对于保证仓颉输入法的准确性和实用性起到了重要作用。通过合理的管理和维护,该数据库能够为用户提供全面且准确的中文输入服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值