`
forestking
  • 浏览: 43913 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用Scala 解决Gnome Tetravex

阅读更多

Gnome Teltravex 是一个ACM练习题目,完整的描述在这里http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=8

我主要是为了学习scala语言,所以实现可能有问题;我只是简单的测试一下,因为无法提交,所以无法完全确定这个实现是否正确。但这个不是重点。重点是scala。

代码:

 

 

/**
 *
 */

/**
 * @author Blues
 *
 */
class Square(t: Int, r: Int, b: Int, l: Int) {
  val top = t;
  val right = r;
  val bottom = b;
  val left = l;

  override def toString() = "Square [top: " + top + ", right: " + right + ", bottom: " + bottom + ", left: " + left + "]";
  
  override def equals(that: Any):Boolean = that match {
    case that: Square =>  (top == that.top && right == that.right && bottom == that.bottom && left == that.left)
    case _ => false
  }
}

object App {
  def main(args: Array[String]) {
    readAndProcess(readLine, 0);
  }

  def readAndProcess(line: String, counter: Int) {
    val n = line.toInt;
    if (n == 0) {
      return ;
    } else {
      //for 也是表达式,可以使用yield计算
      val squares = for (i <- 0 until n * n) yield {
        val squareLine = readLine();
        val nums = squareLine.split(" ");
        if (nums.length == 4) {
          new Square(nums(0).toInt, nums(1).toInt, nums(2).toInt, nums(3).toInt)
        } else {
          throw new Exception("wrong input");
        }
      }
      val succeeded = process(n, squares.toArray);
      if (succeeded) {
        println("Game " + counter + ": Possible")
      } else {
        println("Game " + counter + ": Impossible")
      }
      //使用递归避免使用while;while没有计算结果,在函数式语言里不被提倡
      readAndProcess(readLine, (counter + 1));
    }
  }

  def process(n: Int, squares: Array[Square]): Boolean = {
    //在函数里定义函数,这个算闭包么?
    def pickSquare(proccededSquares: List[Square]): List[Square] = {
    	squares.filterNot(proccededSquares.contains(_)).toList;
    }

    def dfs(index: Int, proccededSquares: List[Square]): Boolean = {
      //var定义可变变量,不提倡
      var done = false;
      for (pickedSquare <- pickSquare(proccededSquares)
          if !done) {
        val currentRow = index / n;
        val currentCol = index % n;
        //if 也可以计算结果,如此就可以将matched定义为val,不可变类型;
        val matchTop = if (currentRow > 0) {
          val topIndex = (currentRow - 1) * n + currentCol;
          val topSquare = proccededSquares(topIndex);
          topSquare.bottom == pickedSquare.top
        } else {
          true;
        }

        val matchLeft = if (currentCol > 0) {
          val leftIndex = index - 1;
          val leftSquare = proccededSquares(leftIndex);
          leftSquare.right == pickedSquare.left;
        } else {
          true;
        }

        if (matchTop && matchLeft) {
          //list :: 是右操作符,由右边的值调用,并把左边的值作为参数传入
          val addCurrent = (pickedSquare :: (proccededSquares.reverse)).reverse
          println(addCurrent)
          done = dfs(index + 1, addCurrent)
        }
      }
      done;
    }

    dfs(0, Nil);
  }

}

 重点都在注释里面。

 

刚开始学习scala,发现它还是很有趣。

分享到:
评论

相关推荐

    scala sdk scala-2.12.3

    通过学习和使用Scala SDK,开发者可以利用其丰富的语言特性来构建复杂的软件系统,尤其是在大数据处理、Web应用、云计算等领域,Scala已经展现出了强大的生命力。例如Apache Spark,一个流行的分布式计算框架,就是...

    scala3 scala3 scala3 scala3 scala3

    Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对现有Scala2代码库的兼容性。 在Scala3中,最重要的变化之一是类型推断的增强。新的Typelevel Scala项目引入...

    使用Scala进行Web开发:构建你的第一个Web应用.md

    使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发...

    Scala语法简明教程

    - Udemy上的《Scala and Akka Microservices》:教授如何使用Scala和Akka框架构建微服务。 - **社区与论坛**: - Scala官方网站([http://www.scala-lang.org](http://www.scala-lang.org/)):提供了大量的文档...

    scala + mybatis 数据库查询

    通过使用Scala的Java互操作性,我们可以无缝地在Scala中使用MyBatis。 - 集成步骤通常包括添加MyBatis和其Scala绑定库到项目依赖,配置MyBatis的SqlSessionFactory,并编写Scala版的Mapper接口。 2. **Scala版的...

    scala API 操作hbase表

    在本文中,我们将深入探讨如何使用Scala API操作HBase数据库。HBase是一个分布式、面向列的NoSQL数据库,它构建于Hadoop之上,提供实时访问大量数据的能力。Scala是一种强大的函数式编程语言,与Java虚拟机(JVM)...

    scala实战高清讲解

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面...通过阅读这本书,读者不仅能掌握Scala语言的基础,还能了解到如何利用Scala解决实际问题,提升编程技能。

    scala学习源代码

    "示例,或者可能包含一些更复杂的案例,如函数定义、类和对象的创建、集合操作、模式匹配的使用,甚至是Actor系统的简单实现。通过研究这些源代码,你可以更好地理解和掌握Scala语言的核心概念。 总的来说,Scala是...

    windows版scala-2.11.12.zip

    Spark是一个用Scala编写的分布式计算框架,它利用Scala的简洁语法和强大的功能来构建大规模数据处理应用。Scala与Spark的紧密集成使得开发者可以编写出高效的并行和分布式代码。在Windows上配置好Scala环境后,你...

    图解,Eclipse+ADT+ScalaIDE用Scala写Android程序

    标题中的“图解,Eclipse+ADT+ScalaIDE用Scala写Android程序”指的是使用Eclipse集成开发环境(IDE),Android Developer Tools (ADT)插件以及ScalaIDE扩展来编写Android应用程序的过程。这个过程涉及了Java语言替代...

    scala-2.12.10.zip

    Scala的语法优雅且富有表达力,它允许开发者使用函数式编程的特性,如高阶函数、柯里化、模式匹配和不可变数据结构,同时保留了面向对象的类、接口和继承。这使得Scala成为处理大数据、并发和分布式计算的理想选择,...

    scala2.12.1Windows镜像包

    - **构建工具**:Scala项目通常使用sbt(Scala Build Tool)进行构建和管理,它可以自动化编译、测试和打包过程。 - **运行和调试**:在Windows环境下,可以通过命令行或IDE运行Scala程序,IDE还提供了调试功能,...

    scala-2.12.10.tgz

    总的来说,`scala-2.12.10.tgz`是一个全面的Scala安装包,适合在Linux环境中学习和使用Scala语言,无论是初学者还是经验丰富的开发者,都能从中受益。通过深入学习和实践,开发者可以利用Scala的强大功能来构建高...

    scala-2.12.14.zip&scala-2.12.11.tgz Linux版本压缩包.rar

    对于使用Scala进行大数据处理,首先需要安装Spark,然后可以使用Scala API创建Spark程序。Spark提供了SparkContext(SC)作为与集群交互的主要入口点,以及DataFrame和Dataset等高级接口,使得开发人员能够高效地...

    mongo-scala-drive的使用demo

    `mongo-scala-driver` 提供了一个 `MongoClients` 对象,我们可以用它来创建到 MongoDB 服务器的连接: ```scala import org.mongodb.scala._ val mongoClient = MongoClient("mongodb://localhost:27017") ``` ...

    Scala考试题1

    - Scala 使用 REPL(Read-Eval-Print Loop),Java 需要编译。 - Scala 有更强大的模式匹配,Java 需要使用 switch-case 或者 if-else。 15. **Java 集合与 Scala 集合的转换**: - 导入 `scala.jdk....

    学习scala好的项目

    通过这些资源,初学者可以逐步了解如何使用Scala编写Spark程序,包括如何创建SparkSession、加载数据、定义transformations和actions,以及如何使用DataFrame API进行复杂的数据操作。 此外,可能会涉及到的高级...

    最好的scala学习 课件

    这部分会讲解如何使用List、Set、Map等集合,以及如何进行集合操作,如映射、过滤、折叠等。此外,还会涉及Option和Either等类型,它们是处理可能的null值和错误的良好工具。 接着,"Scala进阶之路-part03-面向对象...

Global site tag (gtag.js) - Google Analytics