/*
* 算法思想:
* bfs,从(0,0)开始广度优先搜索;
* 相邻8个点均可以搜索;
* 第一次搜索到(m-1, n-1)位置,当前即为最短的路径。
* Notes:
* 广度优先搜索过程中,使用一个队列作为缓存。
*/
typedef struct point{
int x,y,d;
} Node;
#define LEN 0xffff
void print(int m, int n, int vst[m][n]){
int i,j;
for(i=0; i<m; i++){
for(j=0; j<n; j++){
printf("%d,", vst[i][j]);
}printf("\n");
}
printf("==============");
}
int get(int **arr, int m, int n){
int vst[m][n];
int xs[] = {-1, -1, -1, 0, 0, 0, 1, 1, 1};
int ys[] = {-1, 0, 1, -1, 0, 1, -1, 0, 1};
Node qe[LEN];
int head=0, rear=0, i, x, y, tmp;
Node *node;
memset(vst, 0, sizeof(vst));
if(arr[0][0]) return -1;
qe[head].x = 0;
qe[head].y = 0;
qe[head].d = 1;
head++;
vst[0][0] = 1;
while(head>rear){
node = &qe[rear++];
tmp = node->d;
if(node->x == m-1 && node->y == n-1) return node->d;
for(i=0; i<9; i++){
x = node->x + xs[i];
y = node->y + ys[i];
if(x>=0 && x<m && y>=0 && y<n && !vst[x][y] && !arr[x][y]) {
vst[x][y] = 1;
qe[head].x = x;
qe[head].y = y;
qe[head].d = tmp+1;
head++;
}
}
}
print(m, n, vst);
return -1;
}
int shortestPathBinaryMatrix(int** arr, int m, int* ns){
int n = ns[0];
return get(arr, m, n);
}
leetcode-1091. 二进制矩阵中的最短路径-C语言
最新推荐文章于 2024-08-03 23:25:38 发布