2019蓝桥杯c++B组第五题迷宫

题目

01010101001011001001010110010110100100001000101010

//00001000100000101010010000100000001001100110100101

//01111011010010001000001101001011100011000000010000

//01000000001010100011010000101000001010101011001011

//00011111000000101000010010100010100000101100000000

//11001000110101000010101100011010011010101011110111

//00011011010101001001001010000001000101001110000000

//10100000101000100110101010111110011000010000111010

//00111000001010100001100010000001000101001100001001

//11000110100001110010001001010101010101010001101000

//00010000100100000101001010101110100010101010000101

//11100100101001001000010000010101010100100100010100

//00000010000000101011001111010001100000101010100011

//10101010011100001000011000010110011110110100001000

//10101010100001101010100101000010100000111011101001

//10000000101100010000101100101101001011100000000100

//10101001000000010100100001000100000100011110101001

//00101001010101101001010100011010101101110000110101

//11001010000100001100000010100101000001000111000010

//00001000110000110101101000000100101001001000011101

//10100101000101000000001110110010110101101010100001

//00101000010000110101010000100010001001000100010101

//10100001000110010001000010101001010101011111010010

//00000100101000000110010100101001000001000000000010

//11010000001001110111001001000011101001011011101000

//00000110100010001000100000001000011101000000110011

//10101000101000100010001111100010101001010000001000

//10000010100101001010110000000100101010001011101000

//00111100001000010000000110111000000001000000001011

//10000001100111010111010001000110111010101101111000

#include<bits/stdc++.h>
#define MAXSIZE 2000
using namespace std;
int v[35][55]={0};
char a[35][55];
int m=999999999,dx[]={0,1,0,-1},dy[]={1,0,-1,0};
struct mystack{
    char *base ;
    char  *top;   //指针可以对应一个值的大小
    int size;
    void pop(){
        if(this->top==this->base)
        return ;
        else
            --this->top;
    };
    void push(char data){
        if(this->top-this->base==MAXSIZE)
         return ;
        *this->top++=data;
    };
    
    void foreach(){
//      栈遍历是倒着的,需要正向输出自定义输出即可
        while(this->top!=this->base){
            cout<<*this->base++;
        }
        cout<<endl;
    }
};

void dfs(int x,int y,int step,mystack s){
    //不能引用的&s,因为引用最后遍历无法回溯,引用就是对该栈本身操作
    if(x==30&&y==50){
    if(step<m){
        m=step;
        s.foreach();
        cout<<"Complete"<<endl;
     }
    }
    for(int i=0;i<=3;i++){
        int tx=x+dx[i];
        int ty=y+dy[i];
        if(v[tx][ty]==0&&a[tx][ty]=='0'){
            v[tx][ty]=1;
            if(i==0)
            s.push('R');
            else if(i==1)
            s.push('D');
            else if(i==2)
            s.push('L');
            else if(i==3)
            s.push('U');
            dfs(tx,ty,step+1,s);
            s.pop();
            v[tx][ty]=0;
        }
    }    
    return ;
}
int main(){
    for(int i=1;i<=30;i++){
        for(int j=1;j<=50;j++){
            cin>>a[i][j];
        }
    }
    v[1][1]=1;
    mystack s;
    s.base=new char[MAXSIZE];  // 栈底开辟空间<<<开辟空间就能保存数据了>>>
    s.top=s.base;
//    cout<<(void*)s.top<<endl;  // 转换成void* 就可以输出地址
    s.size=MAXSIZE;
    dfs(1,1,1,s);    return 0;
    }
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值