写过一篇 发表于 2025-2-19 15:15:15

2.18寒假

今天在题单中看了搜索。
https://i-blog.csdnimg.cn/direct/b10041741c2d4b4f8336f7f6da549f30.png
解析:两个一维数组,用于表示上下左右四个方向的偏移量,分别对应 x 轴和 y 轴的偏移,遍历四个方向(左、右、下、上),对于每个方向,检查目标位置是否未走过(temp]] == 0)且不是停滞(map]] == 1)。如果满足条件,将当前位置标记为已走过(temp = 1),然后递归调用 walk 函数继续搜索。递归返回后,将当前位置标记为未走过(temp = 0),以便尝试其他可能的路径。起首读取舆图的长 n、宽 m 和停滞总数 T。
将舆图的全部位置初始化为可通行(map = 1)。读取出发点坐标 (sx, sy) 和终点坐标 (fx, fy)。
循环 T 次,每次读取一个停滞的坐标 (l, r),并将该位置标记为停滞(map = 0)。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int map;
int temp;
int dx = {0, 0, 1, -1};
int dy = {-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]] == 0 && map]] == 1) {
                temp = 1;
                walk(x + dx, y + dy);
                temp = 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 = 1;
      }
    }
    scanf("%d %d", &sx, &sy);
    scanf("%d %d", &fx, &fy);
    for (int u = 1; u <= T; u++) {
      scanf("%d %d", &l, &r);
      map = 0;
    }
    walk(sx, sy);
    printf("%d", total);
    return 0;
} https://i-blog.csdnimg.cn/direct/959c256286364a04ad0e574ea21fcdb7.png
解析:将当前位置 (o, p) 标记为 1,表示该位置已经被访问过。循环遍历四个方向(右、下、左、上),递归调用 dfs 函数继续搜索相邻位置。从矩阵的四条界限(上、下、左、右)开始调用 dfs 函数举行搜索。因为界限上的 0 肯定不会被 1 完全包围,通过 DFS 可以将与界限上的 0 相连通的全部 0 标记为 1。遍历 a 数组,如果某个位置的值仍然为 0,说明该位置的 0 被 1 完全包围,将 b 数组中对应位置的值改为 2。
#include<stdio.h>
int a,b;
int dx={0,0,1,0,-1};
int dy={0,1,0,-1,0};
int n;
void dfs(int o,int p)
{
        int i;
        if(o<0||o>n+1||p<0||p>n+1||a!=0){
                return;
        }
        a=1;
        for(i=1;i<=4;i++){
                dfs(o+dx,p+dy);
        }
}

int main()
{
        int i,j;
        scanf("%d",&n);
        for(i=0;i<n;i++){
                for(j=0;j<n;j++){
                        scanf("%d",&a);
                        b=a;
                }
        }
        for(i=0;i<n;i++)
        dfs(0,i);
        for(i=0;i<n;i++)
        dfs(n-1,i);
        for(i=0;i<n;i++)
        dfs(i,0);
        for(i=0;i<n;i++)
        dfs(i,n-1);
        for(i=0;i<n;i++){
                for(j=0;j<n;j++){
                        if(a==0)
                        b=2;
                }
        }
        for(i=0;i<n;i++){
                for(j=0;j<n;j++)
                printf("%d ",b);
                printf("\n");
        }
        return 0;
}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 2.18寒假