C/C++教程

leetcode_957. N 天后的牢房

本文主要是介绍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]

 

int GetPeriod(int* cells, int cellsSize)
{
    //保存第一天变化
    int array[cellsSize];
    int day1[cellsSize];
    memset(array, 0, sizeof(int)*cellsSize);
    memset(day1, 0, sizeof(int)*cellsSize);
    for(int i = 1; i < cellsSize - 1; i++) {
        if(cells[i - 1] == cells[i + 1]) {
            day1[i] = 1;
        } else {
            day1[i] = 0;
        }
    }
    memcpy(array, day1, sizeof(int) * cellsSize);
    int temp[cellsSize];
    memset(temp, 0, sizeof(int) * cellsSize);
    int cycle = 0;
    while(true) {
        for(int i = 1; i < cellsSize - 1; i++) {
            if(array[i - 1] == array[i + 1]) {
                temp[i] = 1;
            } else {
                temp[i] = 0;
            }
        }
        cycle++;
        memcpy(array, temp, cellsSize * sizeof(int));
        if(memcmp(array, day1, cellsSize* sizeof(int)) == 0) {
            break;
        }
    }
    return cycle;
}





int* prisonAfterNDays(int* cells, int cellsSize, int N, int* returnSize)
{
    int period = GetPeriod(cells, cellsSize);
    int day = N % period;
    if(day == 0) {
        day = period;
    }
    int * result =(int *)malloc(cellsSize * sizeof(int));
    memset(result, 0, sizeof(int) * cellsSize);
    while(day > 0) {
        for(int i = 1; i < cellsSize - 1; i++) {
            if(cells[i - 1] == cells[i + 1]) {
                result[i] = 1;
            } else {
                result[i] = 0;
            }
        }
        /*还需要把 result 里面的值复制给 cells*/
        memcpy(cells, result, cellsSize * sizeof(int));
        day--;
    }
    *returnSize = cellsSize;
    return result;


}
View Code

 

这篇关于leetcode_957. N 天后的牢房的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!