//首先需要队列的相关函数
typedef struct{
int (*index)[2];
int head;
int tail;
}queue;
//队列基本元素
//队列的创建
queue * creat(int size)
{
queue* tar = (queue *)malloc(sizeof(queue));
tar->head = 0;
tar->index = (int(*)[2])calloc(size * 2, sizeof(int));
tar->tail=0;
return tar;
}
//入队函数,出队函数
void Inqueue(int x,int y,queue * queue)
{
queue->index[queue->tail][0]= x;
queue->index[queue->tail][1]=y;
queue->tail++;
}
void Dequeue(queue* queue,int*a)
{
a[0]=queue->index[queue->head][0];
a[1] = queue->index[queue->head][1];
queue->head++;
}
//队列判空函数
bool IsEmpty(queue* queue)
{
return queue->tail==queue->head;
}
//队列释放函数
void Free(queue* queue)
{
free(queue->index);
free(queue);
}
int orangesRotting(int** grid, int gridSize, int* gridColSize){
//使用广度优先算法
int time=0;int*index = (int*)malloc(2 * sizeof(int));
//第一步,要统计这个网格的总
int size = 0;
int sum =0;
for(int i = 0;i<gridSize;i++)
{
size+=gridColSize[i];
}
//初始化队列
queue* q = creat(size);
//第二步,统计坏的并入队列,并且看看是否好的为零
for(int i =0;i<gridSize;i++)
{
for(int j =0;j<gridColSize[i];j++)
{
if(grid[i][j]==2) Inqueue(i,j,q);
else if(grid[i][j]==1)
{
sum++;
}
}
}
if(sum ==0) return 0;
int level=q->tail;//记下同一时间坏的,用于鉴别
while(!IsEmpty(q))
{
if(level == q->head)
{
level = q->tail;
time++;
}
Dequeue(q,index);
if(index[0] - 1 >= 0 && grid[index[0] - 1][index[1]] == 1){
grid[index[0] - 1][index[1]] = 2;
Inqueue( index[0] - 1, index[1],q);
}
if(index[0] + 1 < gridSize && grid[index[0] + 1][index[1]] == 1){
grid[index[0] + 1][index[1]] = 2;
Inqueue(index[0] + 1, index[1],q);
}
if(index[1] - 1 >= 0 && grid[index[0]][index[1] - 1] == 1){
grid[index[0]][index[1] - 1] = 2;
Inqueue( index[0], index[1] - 1,q);
}
if(index[1] + 1 < gridColSize[index[0]] && grid[index[0]][index[1] + 1] == 1){
grid[index[0]][index[1] + 1] = 2;
Inqueue( index[0], index[1] + 1,q);
}}
Free(q);
free(index);
for(int i = 0;i < gridSize;i ++)
for(int j = 0;j < gridColSize[i];j ++)
if(grid[i][j] == 1)
return -1;
return time;
}
腐烂的橘子 C语言
最新推荐文章于 2023-02-15 13:40:01 发布