1.23学习总结

文章回顾了作者前一天学习的深度优先搜索(DFS),完成了相关题目,并深入学习了C++中的栈和广度优先搜索(BFS)。通过一道栈题目展示了如何使用栈模拟操作,接着介绍了BFS的基本原理和用法,强调了队列操作和数据结构的运用。
摘要由CSDN通过智能技术生成

今天主要对昨天学习的dfs进行了复习,以及重做了一遍昨天做过的题目。大部分时间用来学习c++,只做了一道关于栈的题目,还学习了一下bfs的模板,明天刷有关bfs的题目。

题目:

这道题思路是使用栈来模拟入栈和出栈的操作。首先按照入栈序列的顺序将元素入栈,然后判断栈顶元素是否与出栈序列的第一个元素相同,如果相同则将栈顶元素弹出,同时出栈序列的指针向后移动一位。重复这个过程,直到栈为空或者栈顶元素与出栈序列的第一个元素不相同。如果栈为空,则出栈序列是合法的,输出"Yes";如果栈不为空,则出栈序列不合法,输出"No"。

代码呈上:

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		int n,j=0,a[100002],b[100002];
		cin >> n;
		for(int i=0;i<n;i++)
			cin >> a[i];
		for(int i=0;i<n;i++)
			cin >> b[i];
		stack<int>s;
		for(int i=0;i<n;i++)
		{
			s.push(a[i]);
		while(s.top()==b[j])
		{
			s.pop();
			j++;
			if(s.empty())
			break;
		}
		}
		if(s.empty())
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}

BFS:

#include<bits/stdc++.h>
using namespace std;
int a[100][100],book[100][100];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
struct point{
	int x;
	int y;
	int step;
};
queue<point>r;
int main()
{
	int n,m,startx,starty,p,q;
	scanf("%d %d",&n,&m);
	scanf("%d %d %d %d",&startx,&starty,&p,&q);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&a[i][j]);
	point start;
	start.x=startx;
	start.y=starty;
	start.step=0;
	r.push(start);
	while(!r.empty())
	{
		int x=r.front().x;
		int y=r.front().y;
		if(x==p&&y==q)
		{
			printf("%d\n",r.front().step);
			break;
		}
		for(int k=0;k<=3;k++)
		{
			int tx=x+dx[k];
			int ty=y+dy[k];
			if(tx<1||ty<1||tx>n||ty>m)
				continue;
			if(a[tx][ty]==0&&book[tx][ty]==0)
			{
				point temp;
				temp.x=tx;
				temp.y=ty;
				temp.step=r.front().step+1;
				r.push(temp);
				book[tx][ty]=1;
			}
			 
		}
		r.pop();
	}
	return 0;
}

 广度优先搜索旨在面临一个路口时,把所有的岔路口都记下来,然后选择其中一个进入,然后将它的分路情况记录下来,然后再返回来进入另外一个岔路,并重复这样的操作。在BFS中,关键点则是状态的选取和标记。要注意bfs要用到队列,掌握入列,出列等操作,还要注意要创建一个结构体,同时不要忘记创建一个临时变量temp,最后不要忘记出队。                      

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值