算法题--华为od机试考试(围棋的气、用连续自然数之和来表达整数、亲子游戏)

目录

围棋的气

题目描述

输入描述

示例1

输入

输出

解析

答案

用连续自然数之和来表达整数

题目描述

输入描述

输出描述

示例1

输入

输出

说明

示例2

输入

输出

解析

答案

亲子游戏

题目描述

输入描述

输出描述

示例1

输入

输出

说明

示例2

输入

输出

说明

备注

解析


围棋的气

考察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 =&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值