国内 设计网站的公司,北京网站建设手机app,深圳中装建设集团有限公司,计算机文化基础网页制作题视频今天在题单中看了搜索。 解析#xff1a;两个一维数组#xff0c;用于表示上下左右四个方向的偏移量#xff0c;分别对应 x 轴和 y 轴的偏移#xff0c;遍历四个方向#xff08;左、右、下、上#xff09;#xff0c;对于每个方向#xff0c;检查目标位置是否未走过两个一维数组用于表示上下左右四个方向的偏移量分别对应 x 轴和 y 轴的偏移遍历四个方向左、右、下、上对于每个方向检查目标位置是否未走过temp[x dx[i]][y dy[i]] 0且不是障碍map[x dx[i]][y dy[i]] 1。如果满足条件将当前位置标记为已走过temp[x][y] 1然后递归调用 walk 函数继续搜索。递归返回后将当前位置标记为未走过temp[x][y] 0以便尝试其他可能的路径。首先读取地图的长 n、宽 m 和障碍总数 T。 将地图的所有位置初始化为可通行map[ix][iy] 1。读取起点坐标 (sx, sy) 和终点坐标 (fx, fy)。 循环 T 次每次读取一个障碍的坐标 (l, r)并将该位置标记为障碍map[l][r] 0。
#include stdio.h
#include stdlib.h
#include math.h
int map[6][6];
int temp[6][6];
int dx[4] {0, 0, 1, -1};
int dy[4] {-1, 1, 0, 0};
int total, fx, fy, sx, sy, T, n, m, l, r;
void walk(int x, int y) {if (x fx y fy) {total;return;} else {for (int i 0; i 3; i) {if (temp[x dx[i]][y dy[i]] 0 map[x dx[i]][y dy[i]] 1) {temp[x][y] 1;walk(x dx[i], y dy[i]);temp[x][y] 0;}}}
}
int main() {scanf(%d %d %d, n, m, T);for (int ix 1; ix n; ix) {for (int iy 1; iy m; iy) {map[ix][iy] 1;}}scanf(%d %d, sx, sy);scanf(%d %d, fx, fy);for (int u 1; u T; u) {scanf(%d %d, l, r);map[l][r] 0;}walk(sx, sy);printf(%d, total);return 0;
} 解析将当前位置 (o, p) 标记为 1表示该位置已经被访问过。循环遍历四个方向右、下、左、上递归调用 dfs 函数继续搜索相邻位置。从矩阵的四条边界上、下、左、右开始调用 dfs 函数进行搜索。因为边界上的 0 肯定不会被 1 完全包围通过 DFS 可以将与边界上的 0 相连通的所有 0 标记为 1。遍历 a 数组如果某个位置的值仍然为 0说明该位置的 0 被 1 完全包围将 b 数组中对应位置的值改为 2。
#includestdio.h
int a[30][30],b[30][30];
int dx[5]{0,0,1,0,-1};
int dy[5]{0,1,0,-1,0};
int n;
void dfs(int o,int p)
{int i;if(o0||on1||p0||pn1||a[o][p]!0){return;}a[o][p]1;for(i1;i4;i){dfs(odx[i],pdy[i]);}
}int main()
{int i,j;scanf(%d,n);for(i0;in;i){for(j0;jn;j){scanf(%d,a[i][j]);b[i][j]a[i][j];}}for(i0;in;i)dfs(0,i);for(i0;in;i)dfs(n-1,i);for(i0;in;i)dfs(i,0);for(i0;in;i)dfs(i,n-1);for(i0;in;i){for(j0;jn;j){if(a[i][j]0)b[i][j]2;}}for(i0;in;i){for(j0;jn;j)printf(%d ,b[i][j]);printf(\n);}return 0;
}