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,开发者可以利用其丰富的语言特性来构建复杂的软件系统,尤其是在大数据处理、Web应用、云计算等领域,Scala已经展现出了强大的生命力。例如Apache Spark,一个流行的分布式计算框架,就是...
Scala3的发布标志着该语言的进一步成熟,它引入了一系列改进,旨在解决早期版本中的一些痛点,同时保持对现有Scala2代码库的兼容性。 在Scala3中,最重要的变化之一是类型推断的增强。新的Typelevel Scala项目引入...
使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发使用Scala进行Web开发...
- Udemy上的《Scala and Akka Microservices》:教授如何使用Scala和Akka框架构建微服务。 - **社区与论坛**: - Scala官方网站([http://www.scala-lang.org](http://www.scala-lang.org/)):提供了大量的文档...
通过使用Scala的Java互操作性,我们可以无缝地在Scala中使用MyBatis。 - 集成步骤通常包括添加MyBatis和其Scala绑定库到项目依赖,配置MyBatis的SqlSessionFactory,并编写Scala版的Mapper接口。 2. **Scala版的...
在本文中,我们将深入探讨如何使用Scala API操作HBase数据库。HBase是一个分布式、面向列的NoSQL数据库,它构建于Hadoop之上,提供实时访问大量数据的能力。Scala是一种强大的函数式编程语言,与Java虚拟机(JVM)...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,使得它在处理并发和大数据分析方面...通过阅读这本书,读者不仅能掌握Scala语言的基础,还能了解到如何利用Scala解决实际问题,提升编程技能。
"示例,或者可能包含一些更复杂的案例,如函数定义、类和对象的创建、集合操作、模式匹配的使用,甚至是Actor系统的简单实现。通过研究这些源代码,你可以更好地理解和掌握Scala语言的核心概念。 总的来说,Scala是...
Spark是一个用Scala编写的分布式计算框架,它利用Scala的简洁语法和强大的功能来构建大规模数据处理应用。Scala与Spark的紧密集成使得开发者可以编写出高效的并行和分布式代码。在Windows上配置好Scala环境后,你...
标题中的“图解,Eclipse+ADT+ScalaIDE用Scala写Android程序”指的是使用Eclipse集成开发环境(IDE),Android Developer Tools (ADT)插件以及ScalaIDE扩展来编写Android应用程序的过程。这个过程涉及了Java语言替代...
Scala的语法优雅且富有表达力,它允许开发者使用函数式编程的特性,如高阶函数、柯里化、模式匹配和不可变数据结构,同时保留了面向对象的类、接口和继承。这使得Scala成为处理大数据、并发和分布式计算的理想选择,...
- **构建工具**:Scala项目通常使用sbt(Scala Build Tool)进行构建和管理,它可以自动化编译、测试和打包过程。 - **运行和调试**:在Windows环境下,可以通过命令行或IDE运行Scala程序,IDE还提供了调试功能,...
对于使用Scala进行大数据处理,首先需要安装Spark,然后可以使用Scala API创建Spark程序。Spark提供了SparkContext(SC)作为与集群交互的主要入口点,以及DataFrame和Dataset等高级接口,使得开发人员能够高效地...
`mongo-scala-driver` 提供了一个 `MongoClients` 对象,我们可以用它来创建到 MongoDB 服务器的连接: ```scala import org.mongodb.scala._ val mongoClient = MongoClient("mongodb://localhost:27017") ``` ...
- Scala 使用 REPL(Read-Eval-Print Loop),Java 需要编译。 - Scala 有更强大的模式匹配,Java 需要使用 switch-case 或者 if-else。 15. **Java 集合与 Scala 集合的转换**: - 导入 `scala.jdk....
通过这些资源,初学者可以逐步了解如何使用Scala编写Spark程序,包括如何创建SparkSession、加载数据、定义transformations和actions,以及如何使用DataFrame API进行复杂的数据操作。 此外,可能会涉及到的高级...
这部分会讲解如何使用List、Set、Map等集合,以及如何进行集合操作,如映射、过滤、折叠等。此外,还会涉及Option和Either等类型,它们是处理可能的null值和错误的良好工具。 接着,"Scala进阶之路-part03-面向对象...
研究这些源码可以帮助你更深入地理解如何使用这些工具。 3. **反射和元编程**:Scala的反射API允许在运行时检查和操作类型信息。元编程则利用反射来生成和操作代码。源码揭示了这些功能是如何实现的。 4. **并发和...