您的位置:首页 > 其它

Boerner's theorem

2016-07-16 21:06 281 查看
import scala.util.Random

/**
* Created by fhqplzj on 16-7-16 at 下午8:06.
*/
/**
* 该程序的主要作用是验证一个定理,虽然结果证明定理事对的,但是不会证明。
* Boerner's theorem.
* True or false: If you sort each column of a matrix, then sort
* each row, the columns are still sorted. Justify your answer.
* 《算法》这本书357页最后一道题。
*/
object Justify {
val rows = 30
val cols = 40
val bound = 1000
val rand = new Random(System.nanoTime())
val sep = Array.fill(80)('*').mkString

def main(args: Array[String]) {
separate()
val matrix = generator
printMatrix(matrix)
separate("按列排序")
val column = sortColumn(matrix)
printMatrix(column)
separate("按行排序")
val row = sortRow(column)
printMatrix(row)
separate("验证结果")
val result = checker(row)
println("result = " + result)
}

def generator = {
val matrix = Array.tabulate(rows, cols) {
(row, col) =>
rand.nextInt(bound)
}
matrix
}

def printMatrix(matrix: Array[Array[Int]]): Unit = {
matrix.foreach {
line =>
println(line.mkString("\t"))
}
}

def separate(s: String = "华丽丽的分割线"): Unit = {
println()
println(sep + s + sep)
println()
}

def sortColumn(matrix: Array[Array[Int]]) = {
val result = Array.ofDim[Int](rows, cols)
for (col <- 0 until cols) {
val tmp = Array.ofDim[Int](rows)
val sorted = Array.ofDim[Int](rows)
for (row <- 0 until rows) {
tmp(row) = matrix(row)(col)
}
tmp.sorted.copyToArray(sorted)
for (row <- 0 until rows) {
result(row)(col) = sorted(row)
}
}
result
}

def sortRow(matrix: Array[Array[Int]]) = {
val result = Array.ofDim[Int](rows, cols)
for (row <- 0 until rows) {
matrix(row).sorted.copyToArray(result(row))
}
result
}

def checker(matrix: Array[Array[Int]]): Boolean = {
for (col <- 0 until cols) {
val tmp = Array.ofDim[Int](rows)
for (row <- 0 until rows) {
tmp(row) = matrix(row)(col)
}
if (!isSorted(tmp))
return false
}
true
}

def isSorted(xs: Array[Int]): Boolean = {
for (i <- 1 until xs.length if xs(i) < xs(i - 1))
return false
true
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: