学习总结——1.23

发布时间:2024年01月24日

1.题目:P4387 【深基15.习9】验证栈序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)(被这道题上了一课)

因为是小白(只会c语言)对c++还鲜有接触,所以看了很多b站视频讲栈的数据结构,后面也按大佬的代码思路来求解,于是便写了一个复杂易错的c代码,错了很多遍(细节超多)好在有大佬的代码指引我前行(嘿嘿嘿),但是最后虽然成功写完而且过了,可自己回头看的时候头又痛了,痛定思痛决定舍弃这个代码。

然后回归问题本质,既然只是判断输入的pushed的出栈序列是不是输入的poped序列,那么就回归到朴实无华的数组倒序输出问题吧,然后结果虽然是正确的,但是莫得分,于是再加一点点栈的知识(小白专属:【C语言】栈和队列真是太有意思啦_哔哩哔哩_bilibili)写了一个朴实无华的代码:

#include<stdio.h>
int main()
{
? ? int n,m;
? ? int arr[10000],b[10000];??
? ? int zhan[10000];? ? ? ? ? ? //朴实无华的命名
? ? int top=-1,sum=0;
? ? scanf("%d",&n);??
? ? while(n--)
? ? {
? ? ? ? scanf("%d",&m);
? ? ? ? for(int i=0;i<m;i++)
? ? ? ? ? ? scanf("%d",&arr[i]);
? ? ? ? for(int i=0;i<m;i++)
? ? ? ? ? ? scanf("%d",&b[i]);
? ? ? ? for(int i=0;i<m;i++)
? ? ? ? ? ? zhan[++top]=arr[i];? ? ? ?//将数组arr的元素入栈
? while(zhan[top]==b[sum]&&zhan[top]&&b[sum])? ?//当栈顶元素和数组b元素相同且都不为空时
? ? ? ? {
? ? ? ? ? ? sum++;? ? ? ? ??
? ? ? ? ? ? top--;? ? ? ? ?//模拟出栈
? ? ? ? }
? ? ? ? if(top!=-1)? ? ? ? ? //如果top不等于-1,即栈中仍有元素没有与数组b中的元素相匹配,也就是说两个数组不相等
? ? ? ? printf("No\n");
? ? else
? ? ? ? printf("Yes\n");
? ? ? ? top=-1,sum=0;? ? //非常重要的一步,将数据重置以便处理下一组数据
? ? }

? ? return 0;
}
?

2.走迷宫(dfs版——递归)也是颇为头痛:P1605 迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

话不多说,上代码:

#include <stdio.h>
#include <stdlib.h>

int book[51][51], arr[51][51];? ? ? ? ? ? //book数组用来标记走过或不能走的点
int n, m, t, p, q, z, c, sum = 0;? ?

? ? ?//n,m为迷宫行和列 ,t表示有几个障碍物,p和q表示终点坐标,z和c为障碍物坐标

int next[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};? ? ? ? ? ?//分别代表右、下、上、左(画图比较好理解)

void dfs(int x, int y, int step) {
? ? int tx, ty, k;
? ? if (x == p && y == q) {
? ? ? ? sum++;
? ? ? ? return;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//先判断简单的部分,即找到终点,路径sum+1
? ? }
? ? for (k = 0; k <= 3; k++) {? ? ? ?//开始正片,因为有四个方向,所以搜索四次
? ? ? ? tx = x + next[k][0];? ? ? ? ? ?
? ? ? ? ty = y + next[k][1];? ? ? ? ? ??//这两步有点抽象,但是没什么是画个小图解决不了的
? ? ? ? if (tx < 1 || tx > n || ty < 1 || ty > m) {? ? ? ? ? //防止越界
? ? ? ? ? ? continue;
? ? ? ? }
? ? ? ? if (arr[tx][ty] == 0 && book[tx][ty] == 0) {? ? ?
? ? ? ? ? ? book[tx][ty] = 1;? ? ? ? ? ? //如果没访问过该点,则将该点标记
? ? ? ? ? ? dfs(tx, ty, step + 1);? ? ? //将当前坐标作为新起点继续搜索
? ? ? ? ? ? book[tx][ty] = 0;? ? ? ? ? ??//保留上一个节点,确保在后续的搜索中,这个位置可以被再次考虑
? ? ? ? }
? ? }
}

int main() {
? ? int i, j, sx, sy;? ? ? ? ? ? ? ? ? ? ? ? //sx和sy表示起点坐标
? ? scanf("%d %d %d", &n, &m, &t);
? ? for (i = 1; i <= n; i++) {
? ? ? ? for (j = 1; j <= m; j++) {
? ? ? ? ? ? arr[i][j] = 0;? ? ? ? ? ? ? ? ? ?//全部标记为未访问
? ? ? ? }
? ? }
? ? scanf("%d %d %d %d", &sx, &sy, &p, &q);
? ? for (i = 1; i <= t; i++) {
? ? ? ? scanf("%d %d", &z, &c);
? ? ? ? arr[z][c] = 1;? ? ? ? ? ? ? ? ? ? ? ?//障碍物标记为不可访问或已访问
? ? }

? ? book[sx][sy] = 1;? ? ? ? ? ? ? ? ? ? //起点同上
? ? dfs(sx, sy, 0);
? ? printf("%d", sum);? ? ? ? ? ? ? ? ? //输出最终有几种路径
? ? return 0;
}

3.dfs的关键点在于目前这一步怎么做和下一步怎么做,理清楚这个问题就差不多了

画个大饼——明天把bfs啃下来,加油

文章来源:https://blog.csdn.net/2301_81263955/article/details/135791486
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。