力扣 934. 最短的桥
#include <stdbool.h>
#include <stdio.h>
#define MAX_LEGTH 102
#define DIRECTION_NUM 4
#define ISLAND_NUM 2
typedef struct Point {
int rowId;
int columnId;
}Point;
bool g_visitFlag[MAX_LEGTH][MAX_LEGTH];
Point g_queueFirst[MAX_LEGTH * MAX_LEGTH];
Point g_queueSecond[MAX_LEGTH * MAX_LEGTH];
int g_minLength;
int g_islandNum;
int g_queueFirstSize;
void BfsIsland(int startRowId, int startColumnId, int rowNum, int *columnNum, int** inputData)
{
int frontId = 0;
int rearId = 0;
int directionRow[] = {0 , 1, -1 ,0};
int directionColumn[] = {1 , 0, 0 ,-1};
int directionId;
int i;
int length;
Point *queue = (g_islandNum == 0) ? g_queueFirst : g_queueSecond;
Point nowPoint;
Point nextPoint;
nowPoint.rowId = startRowId;
nowPoint.columnId = startColumnId;
g_visitFlag[nowPoint.rowId][nowPoint.columnId] = true;
queue[rearId++] = nowPoint;
while (frontId < rearId) {
nowPoint = queue[frontId++];
if (g_islandNum != 0) {
for (i = 0; i < g_queueFirstSize; i++) {
nextPoint = g_queueFirst[i];
length = abs(abs(nowPoint.rowId - nextPoint.rowId) + abs(nowPoint.columnId - nextPoint.columnId) - 1);
g_minLength = (g_minLength > length) ? length : g_minLength;
}
}
for (directionId = 0; directionId < DIRECTION_NUM; directionId++) {
nextPoint.rowId = nowPoint.rowId + directionRow[directionId];
nextPoint.columnId = nowPoint.columnId + directionColumn[directionId];
if (nextPoint.rowId < 0 || nextPoint.rowId >= rowNum || nextPoint.columnId < 0 || nextPoint.columnId >= columnNum[nextPoint.rowId]) {
continue;
}
if (inputData[nextPoint.rowId][nextPoint.columnId] == 0) {
continue;
}
if (g_visitFlag[nextPoint.rowId][nextPoint.columnId] == true) {
continue;
}
g_visitFlag[nextPoint.rowId][nextPoint.columnId] = true;
queue[rearId++] = nextPoint;
}
}
if (g_islandNum == 0) {
g_queueFirstSize = rearId;
}
}
int shortestBridge(int** A, int ASize, int* AColSize)
{
int i;
int j;
g_islandNum = 0;
g_minLength = MAX_LEGTH + MAX_LEGTH;
memset(g_visitFlag, false, sizeof(g_visitFlag));
for (i = 0; i < ASize; i++) {
for (j = 0; j < AColSize[i]; j++) {
if ((A[i][j] == 1) && (g_visitFlag[i][j] == false)) {
BfsIsland(i, j, ASize, AColSize, A);
g_islandNum++;
if (g_islandNum == ISLAND_NUM) {
return g_minLength;
}
}
}
}
return 0;
}