yuin #5277(2008/01/12 11:11 GMT) [ Scala ] Rating0/0=0.00
たまには一番乗り狙いで。
シンプルに穴掘り法を使いました。 また速度重視ということで手続き型スタイルなScalaになっています。
な環境で
でした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
import java.util.Random import java.lang.Integer.parseInt import scala.collection.mutable.{HashMap, Stack} import scala.util.Sorting.stableSort object main{ def main(args: Array[String]) = { mazeGenerate(parseInt(args(0)),parseInt(args(1))) } type Coord = (int, int) final val BLANK = '■' final val FILL = '□' def mazeGenerate(_n:int, _m:int) = { val n = _n*2+1 val m = _m*2+1 val map = new HashMap[Coord, Char] val stack = new Stack[Coord] val ramdom = new Random val range = Array(0,1,2,3) def badCoord_?(c:Coord) = map.getOrElse(c, BLANK) == FILL || c._1 > n-2 || c._1 < 1 || c._2 > m-2 || c._2 < 1 stack += (1,1) map(stack.top) = FILL var break=false; while(!break) { var c = stack.top var siblings = Array((c._1, c._2-2), (c._1+2, c._2), (c._1-2, c._2), (c._1, c._2+2)) if(siblings.forall(badCoord_?(_))){ stack.pop if(stack.isEmpty) { break=true } }else { var candies = stableSort[int,int](range, { x=>ramdom.nextInt(4) }) var break2=false;var i= -1; while({i = i+1; !break2&&i<4}) { var sibling = siblings(candies(i)) if(!badCoord_?(sibling)) { var (x,y) = (sibling._1-c._1, sibling._2-c._2) stack += sibling if(x != 0) { map((c._1+x/2, c._2)) = FILL }else { map((c._1, c._2+y/2)) = FILL } map(sibling) = FILL break2 = true } } } } for(i <- (0 until m); j <- (0 until n)) { print(map.getOrElse((j,i), BLANK)) if(j == n-1){ println("") } } } }
Rating0/0=0.00-0+
1 reply [ reply ]
yuin
#5277()
[
Scala
]
Rating0/0=0.00
たまには一番乗り狙いで。
シンプルに穴掘り法を使いました。 また速度重視ということで手続き型スタイルなScalaになっています。
な環境で
でした。
import java.util.Random import java.lang.Integer.parseInt import scala.collection.mutable.{HashMap, Stack} import scala.util.Sorting.stableSort object main{ def main(args: Array[String]) = { mazeGenerate(parseInt(args(0)),parseInt(args(1))) } type Coord = (int, int) final val BLANK = '■' final val FILL = '□' def mazeGenerate(_n:int, _m:int) = { val n = _n*2+1 val m = _m*2+1 val map = new HashMap[Coord, Char] val stack = new Stack[Coord] val ramdom = new Random val range = Array(0,1,2,3) def badCoord_?(c:Coord) = map.getOrElse(c, BLANK) == FILL || c._1 > n-2 || c._1 < 1 || c._2 > m-2 || c._2 < 1 stack += (1,1) map(stack.top) = FILL var break=false; while(!break) { var c = stack.top var siblings = Array((c._1, c._2-2), (c._1+2, c._2), (c._1-2, c._2), (c._1, c._2+2)) if(siblings.forall(badCoord_?(_))){ stack.pop if(stack.isEmpty) { break=true } }else { var candies = stableSort[int,int](range, { x=>ramdom.nextInt(4) }) var break2=false;var i= -1; while({i = i+1; !break2&&i<4}) { var sibling = siblings(candies(i)) if(!badCoord_?(sibling)) { var (x,y) = (sibling._1-c._1, sibling._2-c._2) stack += sibling if(x != 0) { map((c._1+x/2, c._2)) = FILL }else { map((c._1, c._2+y/2)) = FILL } map(sibling) = FILL break2 = true } } } } for(i <- (0 until m); j <- (0 until n)) { print(map.getOrElse((j,i), BLANK)) if(j == n-1){ println("") } } } }Rating0/0=0.00-0+
1 reply [ reply ]