/*
* 算法思想:
* 广度优先搜索;
* Notes:
* 1. 建立queue时,将所有腐烂的橘子位置都进队;
* 2. 使用total记录好的橘子数量,等total为0时候,返回。
*
*/
typedef struct point{
int x,y;
int d;
} Node;
#define LEN 0xffff
int get(int **arr, int m, int n, int total){
Node qe[LEN], *node;
int head=0, rear=0, i, x, y, j, last=0;
int xs[] = {-1, 0, 0, 1};
int ys[] = {0, -1, 1, 0};
for(i=0; i<m; i++){
for(j=0; j<n; j++){
if(arr[i][j] == 2){
qe[head].x = i;
qe[head].y = j;
qe[head++].d = 0;
}
}
}
/* 好的橘子数量为0,直接返回0,表示0天就可以腐烂完 */
if(total==0) return 0;
while(rear < head) {
node = &qe[rear++];
if(total <= 0) return last;
for(i=0; i<4; i++){
x = node->x + xs[i];
y = node->y + ys[i];
if(x>=0 && x<m && y>=0 && y<n && arr[x][y] == 1) {
qe[head].x = x;
qe[head].y = y;
qe[head++].d = node->d + 1;
last = node->d + 1;
total--;
arr[x][y] = 2;
}
}
}
/* 无法完成,返回-1 */
return -1;
}
int orangesRotting(int** arr, int m, int* ns){
int n = ns[0];
int i, j, total=0;
for(i=0; i<m; i++){
for(j=0; j<n; j++){
if(arr[i][j] == 1){
total++;
}
}
}
return get(arr, m, n, total);
}
leetcode-994. 腐烂的橘子-C语言
最新推荐文章于 2022-04-22 12:12:40 发布