934. 最短的桥

力扣 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值