1.P4387 【深基15.习9】验证栈序列 https://www.luogu.com.cn/problem/P4387
栈是只允许在一端进行插入或删除操作的线性表。
栈顶:允许插入和删除的一端。栈底:不允许插入和删除的一端。空栈:没有存数据元素的栈。
#include<stdio.h>
int main() {
int num;
scanf("%d",&num); //获取测试用例的数量
while (num--){
int n;
scanf("%d",&n); //获取数组的大小
int arr[n],brr[n];
for (int i=0;i<n;i++){
scanf("%d",&arr[i]); //获取第一个数组的元素
}
for (int i=0;i<n;i++){
scanf("%d",&brr[i]); //获取第二个数组的元素
}
int crr[n],sum=-1; //定义数组crr[]模拟栈,sum记录栈顶位置
int j=0;
for (int i=0;i<n;i++){
crr[++sum]=arr[i]; //将数组arr的元素存储在crr[]数组中
while(sum>=0&&crr[sum]==brr[j]){ //当栈不为空且栈顶元素等于数组brr的元素时,出栈
sum--;
j++;
}
}
if (sum==-1){ //判断当栈是否为空
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}
2.P1605 迷宫 https://www.luogu.com.cn/problem/P1605
DFS 是一种用于遍历或搜索树或图的算法。从一个起始节点开始,尽可能深入树或图的分支,直到无法继续深入,然后回溯并探索其他分支,通过标记已访问的节点来避免重复访问。
回溯是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。
#include<stdio.h>
int p,q,m,n,num=0;
int a[100][100];
int v[100][100];
void dfs(int x,int y){
if(x==p&&y==q){//如果当前位置是终点位置
num++; //路径数量加1
return; //返回上一层递归
}//向右
if(a[x][y+1]==1&&v[x][y+1]==0){//如果右边的位置可达且未访问过
v[x][y+1]=1;//标记右边的位置已访问
dfs(x,y+1);//递归调用dfs函数,继续向右搜索
v[x][y+1]=0;//恢复右边的位置为未访问
}//向下
if(a[x+1][y]==1&&v[x+1][y]==0){
v[x+1][y]=1;
dfs(x+1,y);
v[x+1][y]=0;
}//向左
if(a[x][y-1]==1&&v[x][y-1]==0){
v[x][y-1]=1;
dfs(x,y-1);
v[x][y-1]=0;
}//向上
if(a[x-1][y]==1&&v[x-1][y]==0){
v[x-1][y]=1;
dfs(x-1,y);
v[x-1][y]=0;
}
return;// 返回上一层递归
}
/*优化:
int p,q,m,n,num=0;
int a[100][100];
int v[100][100];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs(int x,int y){
if(x==p&&y==q){
num++;
return;
}
for(int k=0;k<4;k++){
int tx=x+dx[k],ty=y+dy[k];
if(a[tx][ty]==1&&v[tx][ty]==0){
v[tx][ty]=1;
dfs(tx,ty);
v[tx][ty]=0;
}
}
return;
}
*/
int main(){
int t,startx,starty;
scanf("%d%d%d",&m,&n,&t);//获取矩阵的行数、列数和障碍物的数量
scanf("%d%d%d%d",&startx,&starty,&p,&q);//获取起点和终点的坐标
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
a[i][j]=1;//初始化矩阵,将所有位置设为可达
}
}
while(t--){
int X,Y;
scanf("%d%d",&X,&Y);//障碍物的坐标
a[X][Y]=2;//障碍物位置设为不可达
}
v[startx][starty]=1;//标记起点已访问
dfs(startx,starty);
printf("%d",num);
return 0;
}