40分大佬求助,改下代码吧

B3625 迷宫寻路

douBsh @ 2023-06-03 22:20:40

#include<bits/stdc++.h>
using namespace std;
int n,x,y,a[1145][1145];
string whole_map[1145][1145];
int map_x,map_y;
int last_x,last_y;
int next_step[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
bool flag[1145][1145];
bool can_be_found;
void dfs(int x,int y,int step)
{
    int next_x,next_y;
    if(x==last_x&&y==last_y)
    {
        can_be_found=1;
        return;
    }
    for(int i=0;i<=3;i++)
    {
        next_x=x+next_step[i][0];
        next_y=y+next_step[i][1];
        if(next_x<1||next_x>map_x||next_y<1||next_y>map_y)
        {
            continue;
        }
        if(a[next_x][next_y]==0&&flag[next_x][next_y]==0)
        {
            flag[next_x][next_y]=1;
            dfs(next_x,next_y,step+1);
            flag[next_x][next_y]=0;
        }
    }
    return; 
}
int main()
{
    cin>>map_x>>map_y;
    last_x=map_x;
    last_y=map_y;
    for(int i=1;i<=map_x;i++)
    {
        for(int j=1;j<=map_y;j++)
        {
            cin>>whole_map[i][j];
            if(whole_map[i][j]==".")
            {
                a[i][j]=0;
            }
            else
            {
                a[i][j]=1;
            }
        }
    }
    flag[1][1]=1;
    dfs(1,1,0);
    if(can_be_found==1)
    {
        cout<<"Yes";
    }
    else
    {
        cout<<"No";
    }
    return 0;
}

by Max6700 @ 2023-06-09 21:09:49

来看看我的代码,保证你看得懂:

但每一步我都写了注释啊QWQ
#include<bits/stdc++.h>//完美的开头
using namespace std;

int n,m;//行列老红军

int a[200][200];//“只有它还记得我来过……”
char b[200][200];//一名探险家不能没有地图

int ok;
/*
“我军依然顽强抗争,到达终点,现在可以撤离吗?”
“不可以,总司令。”
*/

struct aa
{
    int x,yo;
    aa(int x1,int yl)//……构……构造(?函数(大雾)
    {
        x=x1,yo=yl;
    }
};

void bfs()//当当当,主角登场!
{
    queue<aa> q;//队列好朋友~
    q.push(aa(1,1));//从坐标1,1开始行军!

    while(!q.empty())//循环(还活着)
    {
        aa now=q.front();//抓取、霸体、反打、完美弹伤……啊,跑偏了,抓取队列第一项
        q.pop();//然后把他删惹QAQ

        int x=now.x,yh=now.yo;//“新时代坐标接班人”(好家伙,变量名不能是y)

        //严格地筛选有没有越界
        if(x<1 || x>n )continue;//不符合要求,走你~
        if(yh<1 || yh>m)continue;//不符合要求,走你~
        if(a[x][yh]==1)continue;//不符合要求,走你~
        if(b[x][yh]=='#')continue;//不符合要求,走你~

        a[x][yh]=1;//让它记住你

        if(x==n && yh==m)
        {
            ok=1;//新时代好标兵,居然直接完成任务!
            return;//结束任务!
        }    
        q.push(aa(x+1,yh));//向下行军!
        q.push(aa(x-1,yh));//向上行军!
        q.push(aa(x,yh+1));//向右行军!
        q.push(aa(x,yh-1));//向左行军!
    }
}

int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)//绘制地图ing……
        for(int j=1;j<=m;j++)
            cin>>b[i][j];

    bfs();//行军!

    if(ok)cout<<"Yes";//撤离成功!(60分!)
    else cout<<"No";//暗区:嗨嗨嗨,装备我收了~

    return 0;//哟西,完美结束
}

by Hayashi_LinZe @ 2023-06-10 08:47:44

@douBsh 我发现了几个问题 第一是您的dfs函数递归完了之后不用回溯 也就是说flag变成1之后就不用再变回0 第二是用大string数组输入然后再转换成int存到a数组里会出问题 改成用char输入就没事了(具体啥原因我也不知道qwq)另外您的step似乎完全没有用qwq


by douBsh @ 2023-07-02 18:14:09

好的谢谢已解决 @fxygr2333_IAKIOI @Max6700


by Max6700 @ 2023-07-02 18:24:00

@douBsh 欧克欧克


|