zoukankan      html  css  js  c++  java
  • leetcode-999

    这题看懂题意没难度,但是有没有更好的非步进迭代思路呢,比如一个棋盘巨大的那种,按方向迭代就显得有些低效了。看了提交的代码没发现比较好的思路,首先是不是能在找白棋的步骤简化一些,这里的问题是必须要xy同时满足才能确定白棋坐标,那我想能否用大范围的rand思路配合多指针,毕竟如果是一亿行列的棋盘,这种时间复杂度肯定会爆掉。找到白棋后再直接开多个协程去吃棋子。

    原始版本

    package main
    
    func numRookCaptures(board [][]byte) int {
        dx := []int{-1, 1, 0, 0}
        dy := []int{0, 0, -1, 1}
    
        for i := 0; i < 8; i++ {
            for j := 0; j < 8; j++ {
                if board[i][j] == 'R' {
                    res := 0
                    for k := 0; k < 4; k++ {
                        x := i
                        y := j
                        for {
                            x += dx[k]
                            y += dy[k]
                            if x < 0 || x >= 8 || y >= 8 || y < 0 || board[x][y] == 'B' {
                                break
                            }
                            if board[x][y] == 'p' {
                                res++
                                break
                            }
                        }
                    }
                    return res
                }
            }
        }
        return 0
    }

    稍微加了点并发,实际上,优化问题的关键在于如何找白棋坐标,我也没想到比较可行的方法,难道分批次再开goroutine?

    package main
    
    import "sync"
    var wg sync.WaitGroup
    
    func numRookCaptures(board [][]byte) int {
    
        dx := []int{-1, 1, 0, 0}
        dy := []int{0, 0, -1, 1}
    
        for i := 0; i < 8; i++ {
            for j := 0; j < 8; j++ {
                if board[i][j] == 'R' {
                    res := 0
                    wg.Add(4)
                    for k := 0; k < 4; k++ {
                        go eat(board, dx, dy, i, j, k, &res)
                    }
    
                    wg.Wait()
                    return res
                }
            }
        }
        wg.Wait()
        return 0
    }
    
    func eat(board [][]byte, dx []int, dy []int, x, y, k int, res *int) {
    
        for {
            x += dx[k]
            y += dy[k]
            if x < 0 || x >= 8 || y >= 8 || y < 0 || board[x][y] == 'B' {
                wg.Done()
                break
            }
            if board[x][y] == 'p' {
                *res++
                wg.Done()
                break
            }
        }
    }

    end

    一个没有高级趣味的人。 email:hushui502@gmail.com
  • 相关阅读:
    PostgreSQL数据损坏与checksum
    go get命令无响应解决方法
    vscode离线安装插件
    windows搭建Go语言环境
    centos7安装zabbix 5.0
    搭建人生重开模拟器
    博客园增加打赏
    记一次halo报错
    VM operation inconsistent with current state
    nextcloud安装onlyoffice
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12578041.html
Copyright © 2011-2022 走看看