题目:

题解:
- const int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
- int rows, columns;
-
- typedef struct point {
- int x, y;
- } point;
-
- int longestIncreasingPath(int** matrix, int matrixSize, int* matrixColSize) {
- if (matrixSize == 0 || matrixColSize[0] == 0) {
- return 0;
- }
- rows = matrixSize;
- columns = matrixColSize[0];
-
- int** outdegrees = (int**)malloc(sizeof(int*) * rows);
- for (int i = 0; i < rows; i++) {
- outdegrees[i] = (int*)malloc(sizeof(int) * columns);
- memset(outdegrees[i], 0, sizeof(int) * columns);
- }
- for (int i = 0; i < rows; ++i) {
- for (int j = 0; j < columns; ++j) {
- for (int k = 0; k < 4; ++k) {
- int newRow = i + dirs[k][0], newColumn = j + dirs[k][1];
- if (newRow >= 0 && newRow < rows && newColumn >= 0 && newColumn < columns && matrix[newRow][newColumn] > matrix[i][j]) {
- ++outdegrees[i][j];
- }
- }
- }
- }
-
- point* q = (point*)malloc(sizeof(point) * rows * columns);
- int l = 0, r = 0;
- for (int i = 0; i < rows; ++i) {
- for (int j = 0; j < columns; ++j) {
- if (outdegrees[i][j] == 0) {
- q[r++] = (point){i, j};
- }
- }
- }
- int ans = 0;
- while (l < r) {
- ++ans;
- int size = r - l;
- for (int i = 0; i < size; ++i) {
- point cell = q[l++];
- int row = cell.x, column = cell.y;
- for (int k = 0; k < 4; ++k) {
- int newRow = row + dirs[k][0], newColumn = column + dirs[k][1];
- if (newRow >= 0 && newRow < rows && newColumn >= 0 && newColumn < columns && matrix[newRow][newColumn] < matrix[row][column]) {
- --outdegrees[newRow][newColumn];
- if (outdegrees[newRow][newColumn] == 0) {
- q[r++] = (point){newRow, newColumn};
- }
- }
- }
- }
- }
- return ans;
- }