目录
围棋的气
考察hash、理解、二维数组
题目描述
围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19x19=361个交点,对弈双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。
“气”是围棋中很重要的一个概念,某个棋子有几口气,是指其上下左右方向四个相邻的交叉点中,有几个交叉点没有棋子,由此可知:
1、在棋盘的边缘上的棋子最多有3口气(黑1),在棋盘角点的棋子最多有2口气(黑2),其它情况最多有4口气(白1)
2、所有同色棋子的气之和叫作该色棋子的气,需要注意的是,同色棋子重合的气点,对于该颜色棋子来说,只能计算一次气,比如下图中,黑棋一共4口气,而不是5口气,因为黑1和黑2中间红色三角标出的气是两个黑棋共有的,对于黑棋整体来说只能算一个气。
3、本题目只计算气,对于眼也按气计算,如果您不清楚“眼”的概念,可忽略,按照前面描述的规则计算即可。
现在,请根据输入的黑棋和白棋的坐标位置,计算黑棋和白起一共各有多少气?
输入描述
输入包括两行数据,如:
0 5 8 9 9 10
5 0 9 9 9 8
1、每行数据以空格分隔,数据个数是2的整数倍,每两个数是一组,代表棋子在棋盘上的坐标;
2、坐标的原点在棋盘左上角点,第一个值是行号,范围从0到18;第二个值是列号,范围从0到18。
示例1
输入
0 5 8 9 9 10
5 0 9 9 9 8
输出
15
解析
首先生成一个19*19的二维数组,这里注意new Array后用fill填值生成会导致对象的引用一致问题,需要用map解决。
这里需要设计棋盘每个点的对象,这里用value表示下得棋的颜色, 0 ,1,2表示空、黑、白,white和black属性用于表示是否已经计算过黑白棋的气。
然后只用通过for循环计算每个方向上的如果value为0且,当前计算的属性的值对应为true即可+1。这里注意如果棋下在边界需要考虑数组越界问题。
这里使用?.访问,当属性不存在时会返回undefined。
答案
function getWeiQiAir(str) {
let [black, white] = str.split('\n')
black = black.split(' ').map(Number)
white = white.split(' ').map(Number)
// value: 0 ,1,2表示空、黑、白,white和black属性用于表示是否已经计算过黑白棋的气。
// 注意生成的二维数组不能直接用fill填{ value: 0, white: true, black: true }。这样会导致引用一致,改一个value,所有的value都会变。
let qipan = new Array(19).fill(0).map(v => new Array(19).fill(0).map(v => ({ value: 0, white: true, black: true })))
// 棋盘上下对应的棋
let lenB = black.length
for (let i = 0; i < lenB; i = i + 2) {
qipan[black[i]][black[i + 1]].value = 1
}
let lenW = white.length
for (let i = 0; i < lenW; i = i + 2) {
qipan[white[i]][white[i + 1]].value = 2
}
let sum = 0
// 计算黑棋的气
for (let i = 0; i < lenB; i = i + 2) {
let x = black[i]
let y = black[i + 1]
// 第一个条件判断某一个方向是否为空,第二个条件判断是否被当前颜色计算过
// 注意如果棋下在边界需要考虑数组越界问题。这里使用?.访问,当属性不存在时会返回undefined
if (qipan?.[x - 1]?.[y]?.value == 0 && qipan[x - 1][y].black) {
qipan[x - 1][y].black = false
sum++
}
if (qipan[x]?.[y - 1]?.value == 0 && qipan[x][y - 1].black) {
qipan[x][y - 1].black = false
sum++
}
if (qipan?.[x + 1]?.[y]?.value == 0 && qipan[x + 1][y].black) {
qipan[x + 1][y].black = false
sum++
}
if (qipan[x]?.[y + 1]?.value == 0 && qipan[x][y + 1].black) {
qipan[x][y + 1].black = false
sum++
}
}
// 计算白棋的气
for (let i = 0; i < lenW; i = i + 2) {
let x = white[i]
let y = white[i + 1]
if (qipan?.[x - 1]?.[y]?.value =&