1月22日作业总结

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;
}

​

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值