Boerner's theorem

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
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值