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
  • 相关阅读:
    从属性赋值到MVVM模式详解
    C#综合揭秘——细说事务
    Action与Trigger
    C#综合揭秘——细说多线程(下)
    继承BitmapSource并使用独立存储来缓存远程的图片
    Windows Phone 7 MVVM模式数据绑定和传递参数
    Lambda表达式总结
    Windows Phone页面导航和独立存储开发总结
    RegisterHotKey设置系统级热键《转》
    隐藏统计代码或者任何不想被看见的东西《转》
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12578041.html
Copyright © 2011-2022 走看看