leetcode959. 由斜杠划分区域 矩阵和递归

解题思路: 将1个空格放到3*3 的矩阵, 这样 ‘/’ 和'\\' 变成如下数据, 扩展后使用递归的方式进行查找。

注意 '\\’ 为单个字符, 且字符串中长度即为1 

0 0 1    1 0 0
0 1 0    0 1 0
1 0 0    0 0 1

 

void outputMaxtrix(int** map, int num)
{
    for (int i = 0; i < num; i++) {
        for (int j = 0; j < num; j++) {
            printf("%d, ", map[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
static int ** generate(char ** grid, int num)
{
    int ** map = (int **)calloc(3 * num, sizeof(int *));
    for (int i = 0; i < 3 * num; i++) {
        map[i] = (int *)calloc(3 * num, sizeof(int));
    }
    for (int i = 0; i < num; i++) {
        for (int j = 0; j < num; j++) {
            if (grid[i][j] == '/') {
                map[3 * i + 2][3 * j] = 1;
                map[3 * i + 1][3 * j + 1] = 1;
                map[3 * i][3 * j + 2] = 1;
            } else if (grid[i][j] == '\\') {
                map[3 * i ][3 * j] = 1;
                map[3 * i + 1][3 * j + 1] = 1;
                map[3 * i + 2][3 * j + 2] = 1;
            }
        }
    }
    return map;
}
void dfs(int **map, int x, int y, int num) {
    if (map[x][y] != 0) {
        return;
    }
    map[x][y] = 2;
    if ((x + 1) < num) {
        dfs(map, x + 1, y, num);
    }
    if ((y + 1) < num) {
        dfs(map, x, y + 1, num);
    }
    if ((x - 1) >= 0) {
        dfs(map, x - 1, y, num);
    }
    if ((y - 1) >= 0) {
        dfs(map, x, y - 1, num);
    }
}
int regionsBySlashes(char ** grid, int gridSize)
{
    if (grid == NULL || gridSize <= 0) {
        return 0;
    }
    int num = 3 * gridSize;
    int ** map = generate(grid, gridSize);
    int ret = 0;
    for (int i = 0; i < num; i++) {
        for (int j = 0; j < num; j++) {
            if (map[i][j] == 0) {
                ret++;
                dfs(map, i , j, num);
            }
        }
    }


    for (int i = 0; i < num; i++) {
        free(map[i]);
    }
    free(map);
    return ret;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值