轨道
/
Haskell
Haskell
/
练习
/
围棋计数
围棋计数

围棋计数

困难

说明

数一数围棋棋盘上的得分点。

在围棋(又称 baduk、igo、cờ vây 和 wéiqí)中,用你的棋子把空的交叉点完全围住就能得分。被一名玩家围住的交叉点称为他的地盘。

计算每名玩家的地盘。可以假设,任何被困在对方地盘里的棋子都已经从棋盘上拿掉了。

确定包含指定坐标的那块地盘。

一次可以围住多个空的交叉点,而且判断是否围住时,只有横向和纵向相邻的交叉点才算数。下图中,起作用的棋子标为“O”,不起作用的棋子标为“I”(忽略不计)。空白处表示空的交叉点。

+----+
|IOOI|
|O  O|
|O OI|
|IOI |
+----+

更准确地说,如果一个空的交叉点的所有相邻点要么是该玩家的棋子,要么是属于该玩家地盘的空的交叉点,那么这个交叉点就属于该玩家的地盘。

想了解更多,可以查看 维基百科 或 Sensei's Library。

提示

要完成这个练习,你需要实现以下函数:

  • territories返回每个地盘内各点的坐标(从 1 开始,左上角是 (1,1)),以及谁“拥有”这个地盘。

  • territoriesFor返回包含该坐标的地盘,以及该地盘的拥有者。如果该坐标指向的不是空位,就返回Nothing。

如果一个玩家的棋子是唯一与该地盘相邻的棋子,这个地盘就归该玩家所有。

类型签名已经给你准备好了,但函数需要由你自己定义。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Haskell Exercism

准备好开始 围棋计数 了吗?

注册 Exercism,借助 107 个练习 和真人导师指导,学习并掌握 Haskell,全部免费。