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
标签:cellsSize,int,cells,957,Day,result,sizeof,牢房,leetcode 来源: https://www.cnblogs.com/mhq-martin/p/15974116.html