Advertisement
Guest User

Untitled

a guest
Jul 17th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 3.42 KB | None | 0 0
  1. object Main {
  2. def main(args: Array[String]) {  
  3.   import Naval.{Point, Field, Ship, Fleet, Game}
  4.   import Lesson.field
  5.  
  6.   var game: Game = (field, Map() : Fleet)  
  7.   var ships: List[String] = List()  
  8.  
  9.   val N = readLine().toInt
  10.  
  11.   for (i <- 1 to N) {
  12.       val name = readLine().split(" ")
  13.       val toPShip = Stream.continually(readLine()).take(name.last.toInt).sorted
  14.       val ship: Ship = toPShip.toList.map(in => in.split(" ").map(_.toInt)).collect{case Array(a, b) => (a, b)}  
  15.       val temp = game
  16.       game = tryAddShip(temp, name.head, ship)
  17.       if (temp != game){
  18.           ships = name.head :: ships
  19.       }
  20.   }
  21.  
  22.   ships.reverse.foreach(println(_))
  23.    
  24.   def validateShip(ship: Ship): Boolean = (ship.length <= 4) &&
  25.     (ship.map(_._2).forall(_ == ship.head._2) || ship.map(_._1).forall(_ == ship.head._1))
  26.    
  27.   def validatePosition(ship: Ship, field: Field): Boolean = {
  28.       ((if (ship.forall(_._2 == ship.head._2)) {
  29.           ((try {!field(ship.head._1 - 1)(ship.head._2)} catch {case unknown => true}) : Boolean) &&
  30.           ((try {!field(ship.last._1 + 1)(ship.head._2)} catch {case unknown => true}) : Boolean) &&
  31.           ((try {!field(ship.head._1 - 1)(ship.head._2-1)} catch {case unknown => true}) : Boolean) &&
  32.           ((try {!field(ship.last._1 + 1)(ship.head._2-1)} catch {case unknown => true}) : Boolean) &&
  33.           ((try {!field(ship.head._1 - 1)(ship.head._2+1)} catch {case unknown => true}) : Boolean) &&
  34.           ((try {!field(ship.last._1 + 1)(ship.head._2+1)} catch {case unknown => true}) : Boolean) &&
  35.           ((try {!ship.forall(in => field(in._1)(in._2+1))} catch {case unknown => true}) : Boolean) &&
  36.           ((try {!ship.forall(in => field(in._1)(in._2-1))} catch {case unknown => true}) : Boolean)
  37.       } else {
  38.           ((try {!field(ship.head._1)(ship.head._2-1)} catch {case unknown => true}) : Boolean) &&
  39.           ((try {!field(ship.head._1)(ship.last._2+1)} catch {case unknown => true}) : Boolean) &&
  40.           ((try {!field(ship.head._1 - 1)(ship.head._2-1)} catch {case unknown => true}) : Boolean) &&
  41.           ((try {!field(ship.last._1 + 1)(ship.head._2-1)} catch {case unknown => true}) : Boolean) &&
  42.           ((try {!field(ship.head._1 - 1)(ship.head._2+1)} catch {case unknown => true}) : Boolean) &&
  43.           ((try {!field(ship.last._1 + 1)(ship.head._2+1)} catch {case unknown => true}) : Boolean) &&
  44.           ((try {!ship.forall(in => field(in._1-1)(in._2))} catch {case unknown => true}) : Boolean) &&
  45.           ((try {!ship.forall(in => field(in._1+1)(in._2))} catch {case unknown => true}) : Boolean)
  46.       }) : Boolean) && (!ship.forall(in => field(in._1)(in._2)))
  47.   }
  48.   def enrichFleet(fleet: Fleet, name: String, ship: Ship): Fleet = fleet + (name -> ship)
  49.  
  50.   def markUsedCells(field: Field, ship: Ship): Field = {
  51.       var newField = field
  52.       for (point <- ship) {
  53.       val (i, j) = point
  54.       newField = newField.updated(i, newField(i).updated(j, true))
  55.       }
  56.       newField
  57.   }
  58.  
  59.   def tryAddShip(game: Game, name: String, ship: Ship): Game = {
  60.       if (validateShip(ship)){
  61.           if (validatePosition(ship, game._1)){
  62.                val newFleet = game._2 + (name -> ship)
  63.                val newField = markUsedCells(game._1, ship)
  64.                val newGame = (newField, newFleet)
  65.                newGame
  66.           } else {
  67.               game
  68.           }
  69.       } else {
  70.           game
  71.       }
  72.   }
  73.  
  74. }
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement