• Leetcode 957. N 天后的牢房(暴力)


    8 间牢房排成一排,每间牢房不是有人住就是空着。

    每天,无论牢房是被占用或空置,都会根据以下规则进行更改:

    如果一间牢房的两个相邻的房间都被占用或都是空的,那么该牢房就会被占用。
    否则,它就会被空置。
    (请注意,由于监狱中的牢房排成一行,所以行中的第一个和最后一个房间无法有两个相邻的房间。)

    我们用以下方式描述监狱的当前状态:如果第 i 间牢房被占用,则 cell[i]1,否则 cell[i]0。

    根据监狱的初始状态,在 N 天后返回监狱的状况(和上述 N 种变化)。

    示例 1:

    输入:cells = [0,1,0,1,1,0,0,1], N = 7
    输出:[0,0,1,1,0,0,0,0]
    解释:
    下表概述了监狱每天的状况:
    Day 0: [0, 1, 0, 1, 1, 0, 0, 1]
    Day 1: [0, 1, 1, 0, 0, 0, 0, 0]
    Day 2: [0, 0, 0, 0, 1, 1, 1, 0]
    Day 3: [0, 1, 1, 0, 0, 1, 0, 0]
    Day 4: [0, 0, 0, 0, 0, 1, 0, 0]
    Day 5: [0, 1, 1, 1, 0, 1, 0, 0]
    Day 6: [0, 0, 1, 0, 1, 1, 0, 0]
    Day 7: [0, 0, 1, 1, 0, 0, 0, 0]

    示例 2:

    输入:cells = [1,0,0,1,0,0,1,0], N = 1000000000
    输出:[0,0,1,1,1,1,1,0]

    提示:

    cells.length == 8
    cells[i] 的值为 0 或 1
    1 <= N <= 10^9

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/prison-cells-after-n-days
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    注意到变换的总共只有8位数,且开头结尾除了一开始可能为1以后必然为0,那么必然在64次以内发生循环。直接暴力找出循环节即可。

    class Solution {
    public:
        int status[1000][8];
        int vis[1000];
        vector<int> prisonAfterNDays(vector<int>& cells, int n) {
            memset(status, 0, sizeof(status));
            memset(vis, 0, sizeof(vis));
            int rd = 0, pos;
            for(int i = 0; i < 8; i++) {
                status[0][i] = cells[i];
            }
            for(int i = 1; ; i++) {
                int tmp = 0;
                for(int j = 0; j < 8; j++) {
                    if(j == 0 || j == 7) {
                        status[i][j] = 0;
                    } else {
                        status[i][j] = 1 ^ (status[i - 1][j - 1] ^ status[i - 1][j + 1]);
                    }
                    tmp <<= 1;
                    tmp += status[i][j];
                }
                if(vis[tmp]) {
                    rd = i - vis[tmp];
                    pos = vis[tmp];
                    break;
                } else {
                    vis[tmp] = i;
                }
            }
            vector<int> ans;
            cout << pos << " " << rd << endl;
            if(n <= pos + rd - 1) {
                for(int i = 0; i < 8; i++) {
                    ans.push_back(status[n][i]);
                }
            } else {
                int tmp = n - (pos - 1);
                tmp %= rd;
                if(!tmp) n = pos + rd - 1;
                else n = pos + tmp - 1;
                for(int i = 0; i < 8; i++) {
                    ans.push_back(status[n][i]);
                }
            }
            return ans;
        }
    };
    // [1,1,0,1,1,0,1,1]
    // 6
    
  • 相关阅读:
    IOCP十:Client退出后投递WSARecv
    IOCP九:Client退出后投递WSASend
    IOCP九:Client退出后投递WSASend
    CPU线程调度
    CPU线程调度
    windows的磁盘操作之八——格式化分区的思考
    windows的磁盘操作之八——格式化分区的思考
    windows的磁盘操作之六——获取系统所在物理磁盘号
    windows的磁盘操作之六——获取系统所在物理磁盘号
    windows的磁盘操作之七——获取当前所有的物理磁盘号
  • 原文地址:https://www.cnblogs.com/lipoicyclic/p/15863467.html
Copyright © 2020-2023  润新知