zoukankan      html  css  js  c++  java
  • b_lc_黑白翻转棋(一个方向枚举到底 + bfs)

    给一个有旗子的棋盘,下一步可放置一枚黑棋,请问选手这一步最多能翻转多少枚白棋。

    思路:一路枚举到底,控制好条件即可

    class Solution {
    public:
        int n, m;
        struct node {
            int x, y;
        };
        const int d[8][2] = {  {-1, 0}, {1, 0},  {0, -1}, {0, 1},  {-1, -1},{-1, 1},  {1, -1}, {1, 1}};
        int bfs(int x, int y, const vector<string>& g) {
            queue<node> q;
            q.push({x, y});
            vector<string> next = g;
            next[x][y] = 'X';
            int ans = 0;
    
            while (!q.empty()) {
                node t = q.front();
                q.pop();
                //一个方向枚举到底,直到遇到一个黑棋
                for (int i = 0; i < 8; ++i) {
                    int sx = t.x, sy = t.y;
                    int tx = sx + d[i][0], ty = sy + d[i][1];
                    while (tx >= 0 && tx < n && ty >= 0 && ty < m && next[tx][ty] == 'O') {
                        tx += d[i][0], ty += d[i][1];
                    }
                    //遇到了白棋,然后遇到黑棋结束
                    if (tx >= 0 && tx < n && ty >= 0 && ty < m && next[tx][ty] == 'X') {
                        sx += d[i][0], sy += d[i][1];
                        while (sx != tx || sy != ty) {
                            ans++;
                            q.push({sx, sy});
                            next[sx][sy] = 'X';
                            sx += d[i][0], sy += d[i][1];
                        }
                    }
                }
            }
            return ans;
        }
        int flipChess(vector<string>& g) {
            n = g.size(), m = g[0].size();
            int ans = 0;
    
            for (int i = 0; i < n; ++i) {
                for (int j = 0; j < m; ++j) {
                    if (g[i][j] == '.') {
                        ans = max(ans, bfs(i, j, g));
                    }
                }
            }
            return ans;
        }
    };
    
  • 相关阅读:
    算法导论9.33
    第6章 堆排序
    算法导论9.36算法导论9.36 .
    算法导论83排序不同长度的数据项
    算法导论76对区间的模糊排序
    第8章 线性时间排序
    在bochs上运行的第一个操作系统
    算法导论6.58堆排序K路合并
    js中的preventDefault与stopPropagation详解(转)
    JS基础RegExp
  • 原文地址:https://www.cnblogs.com/wdt1/p/15256926.html
Copyright © 2011-2022 走看看