今天主要对昨天学习的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,最后不要忘记出队。