当前位置: 首页 > news >正文

2.18寒假

今天在题单中看了搜索。

解析:两个一维数组,用于表示上下左右四个方向的偏移量,分别对应 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。

#include<stdio.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(o<0||o>n+1||p<0||p>n+1||a[o][p]!=0){
		return;
	}
	a[o][p]=1;
	for(i=1;i<=4;i++){
		dfs(o+dx[i],p+dy[i]);
	}
}

int main()
{
	int i,j;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			scanf("%d",&a[i][j]);
			b[i][j]=a[i][j];
		}
	}
	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[i][j]==0)
			b[i][j]=2;
		}
	}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++)
		printf("%d ",b[i][j]);
		printf("\n");
	}
	return 0;
}

相关文章:

  • 06:高级命令
  • DeepSeek驱动下的数据仓库范式转移:技术解耦、认知重构与治理演进
  • 解析JUC包底层源码实现
  • 3.5 使用Tokenizer编解码文本:从原理到企业级实践
  • ArcGIS笔记之度分秒与十进制度的转换
  • 【分治法】棋盘覆盖问题 C/C++(附代码和测试实例及算法分析)
  • C语言——字符串
  • Udp发送和接收数据(python和QT)
  • 2025-02-18 学习记录--C/C++-PTA 7-25 念数字
  • 鱼骨图技能详解
  • macos安装jmeter测试软件
  • PHP语法入门完全指南(2024新版)
  • 【Spring】Spring配置文件
  • MapReduce远程调试
  • 如何利用快捷指令制作快递取件码提醒?
  • Java 反射机制深度解析:类信息的来源、declared 的区别、赋值操作及暴力反射
  • 如何避免redis长期运行持久化AOF文件过大的问题:AOF重写
  • Docker安装Quickwit搜索引擎
  • 捷米特 JM - RTU - TCP 网关应用 F - net 协议转 Modbus TCP 实现电脑控制流量计
  • 【gRPC】:快速上手gRPC与protobuf
  • 上海银行副行长汪明履新上海农商银行党委副书记
  • 消费维权周报丨上周涉汽车类投诉较多,涉加油“跳枪”等问题
  • 美俄亥俄州北部发生火车撞人事故,致2人死亡、至少1人失踪
  • 《习近平新时代中国特色社会主义思想学习论丛》第十一辑至第十五辑出版发行
  • 浦江潮涌征帆劲,上海以高质量发展服务全国发展大局
  • “南昌航空一号”成功发射,赣江鄱阳湖有了专属卫星守护