墙与门
https://leetcode-cn.com/problems/walls-and-gates/
typedef struct{int x;int y;} Position;Position p[4] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};void wallsAndGates(int** rooms, int roomsSize, int* roomsColSize){int total = roomsSize * (*roomsColSize);Position * queue = malloc(sizeof(Position) * total);int front = 0, rear = 0, num = 0;for(int i = 0; i < roomsSize; i++){for(int j = 0; j < *roomsColSize; j++){if(rooms[i][j] == 0){queue[rear].x = i;queue[rear].y = j;rear = (rear + 1) % total;num++;}}}while(num != 0){Position cur = queue[front];num--;front = (front + 1) % total;for(int i = 0; i < 4; i++){int x = cur.x + p[i].x;int y = cur.y + p[i].y;if(x >= 0 && x < roomsSize && y >= 0 && y < *roomsColSize && rooms[x][y] == 2147483647){rooms[x][y] = rooms[cur.x][cur.y] + 1;queue[rear].x = x;queue[rear].y = y;rear = (rear + 1) % total;num++;}}}}
class Solution {Queue<int[]> q = new LinkedList<int[]>();int[][] directions = {{1, 0},{-1, 0},{0, 1},{0, -1}};int x;int y;public void wallsAndGates(int[][] rooms) {if(rooms == null)return;x = rooms.length;y = rooms[0].length;for(int i = 0; i < x; i++){for(int j = 0; j < y; j++){if(rooms[i][j] == 0){q.add(new int[]{i, j});}}}bfs(rooms);}public void bfs(int[][] rooms, int){int nextX;int nextY;while(!q.isEmpty()){int[] cur = q.poll();for(int[] direction: directions){nextX = cur[0] + direction[0];nextY = cur[1] + direction[1];if(nextX >= x || nextX < 0 || nextY < 0 || nextY >= y || rooms[nextX][nextY] != 2147483647)continue;rooms[nextX][nextY] = rooms[cur[0]][cur[1]] + 1;q.add(new int[]{nextX, nextY});}}}}
岛屿数量
https://leetcode-cn.com/problems/number-of-islands/
typedef struct{int x;int y;} Position;Position p[4] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};int numIslands(char** grid, int gridSize, int* gridColSize){int total = gridSize * (*gridColSize);Position * queue = (Position *)malloc(sizeof(Position) * total);int rear = 0, front = 0, num = 0, count = 0;for(int i = 0; i < gridSize; i++){for(int j = 0 ; j < *gridColSize; j++){if(grid[i][j] == '1'){grid[i][j] = '0';count++;queue[rear].x = i;queue[rear].y = j;num++;rear = (rear + 1) % total;}//遍历每一座岛while(num != 0){Position cur = queue[front];num--;front = (front + 1) % total;for(int m = 0; m < 4; m++){int x = p[m].x + cur.x;int y = p[m].y + cur.y;if(x >= 0 && x < gridSize && y >= 0 && y < *gridColSize && grid[x][y] == '1'){grid[x][y] = '0';queue[rear].x = x;queue[rear].y = y;num++;rear = (rear + 1) % total;}}}}}return count;}
