你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值:
-1 表示墙或是障碍物
0 表示一扇门
INF 无限表示一个空的房间。然后,我们用 231 - 1 = 2147483647 代表 INF。你可以认为通往门的距离总是小于 2147483647 的。
你要给每个空房间位上填上该房间到 最近 门的距离,如果无法到达门,则填 2147483647 即可。
示例:
给定二维网格:
INF -1 0 INF
INF INF INF -1
INF -1 INF -1
0 -1 INF INF
运行完你的函数后,该网格应该变成:
3 -1 0 1
2 2 1 -1
1 -1 2 -1
0 -1 3 4
解答要求时间限制:1000ms, 内存限制:64MB
输入
第一行为m(行数)和n(列数),以空格分隔,之后是表格内容,列间以空格分隔,行间以\n分隔
输出
输出生成后的表格,列间以空格分隔,行间以\n分隔
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Dir {
int x;
int y;
} dir;
dir direction[4] = {
{-1, 0},
{0, -1},
{0, +1},
{1, 0}
};
int dfs(int **table, int i,int j,int m,int n, int **vis)
{
vis[i][j] = 1;
if (table[i][j] == -1) {
vis[i][j] = 0;
return -1;
} else if (table[i][j] != INT_MAX) {
vis[i][j] = 0;
return table[i][j];
} else {
int ans = -1;
for (int k = 0; k<4; k++) {
int x = i + direction[k].x;
int y = j + direction[k].y;
if ((x >= 0 && x < m) && (y >= 0 && y < n) && vis[x][y] == 0) {
int res = dfs(table,x,y,m,n,vis);
if (res >=0) {
if (ans == -1) {
ans = res;
} else {
ans = ans < res ? ans : res;
}
}
}
}
vis[i][j] = 0;
if (ans >= 0) {
return 1 + ans;
} else {
return -1;
}
}
}
int main()
{
printf("%d",INT_MAX);
int m , n;
scanf("%d", &m);
scanf("%d", &n);
int **table = (int **)malloc(sizeof(int *)*m);
int **vis = (int **) malloc(sizeof(int *)*m);
for (int i=0;i<m;i++) {
table[i]= (int *) malloc(sizeof(int)*n);
vis[i]=(int *) malloc(sizeof(int)*n);
memset(vis[i],0,sizeof(int)*n);
for (int j = 0;j<n;j++) {
scanf("%d", &table[i][j]);
}
}
for (int i=0;i<m;i++) {
for (int j = 0;j<n;j++) {
if (table[i][j] == INT_MAX) {
int ret = dfs(table, i, j, m, n, vis);
if (ret == -1){
continue;
}
table[i][j] = ret;
}
}
}
for (int i=0;i<m;i++) {
for (int j = 0;j<n;j++) {
printf("%d ", table[i][j]);
}
printf("\n");
}
return 0;
}