weixin_52536621 2023-05-11 22:06 采纳率: 0%
浏览 22

关于使用auto的死循环问题

#include<bits/stdc++.h>
using namespace std;
#define L(i,l,r) for(int i=l;i<r;++i)
#define R(i,l,r) for(int i=r;i>=l;--i)
const int N=510;
int n,m,dis[3][N][N],dire[3][N][N];
char g[N][N];
string s[4]={"上","右","下","左"};
struct state{
    int x,y,lie;
}q[N*N*3],pre[3][N][N];
bool check(int x,int y){
    if(x>=n||y>=m||x<0||y<0)return false;
    return g[x][y]!='#';
}
int bfs(state st,state end){
    L(k, 0, 3)
    L(i, 0, n)memset(dis[k][i],-1,m*4);
    int d[3][4][3]={
        {{-2,0,2},{0,1,1},{1,0,2},{0,-2,1}},//立(上右下左)(x,y,lie)
        {{-1,0,1},{0,2,0},{1,0,1},{0,-1,0}},//横
        {{-1,0,0},{0,1,2},{2,0,0},{0,-1,2}}//竖
    };
    int hh=0,tt=0;
    q[tt++]=st;
    dis[st.lie][st.x][st.y]=0;
    dire[st.lie][st.x][st.y]=-1;
    while(hh<=tt){
        auto t=q[hh++];
        L(i, 0, 4){
            auto[x,y,lie]=t;
            x+=d[lie][i][0],y+=d[lie][i][1],lie=d[lie][i][2];
            if(!check(x,y))continue;
            if(!lie&&g[x][y]=='E')continue;
            if(lie==1&&!check(x,y+1))continue;
            if(lie==2&&!check(x+1,y))continue;
            if(dis[lie][x][y]==-1){
                dis[lie][x][y]=dis[t.lie][t.x][t.y]+1;
                pre[lie][x][y]={t.x,t.y,t.lie};
                dire[lie][x][y]=i;
                q[tt++]={x,y,lie};
            }
        }
    }
    return dis[end.lie][end.x][end.y];
}
int main(){
    while(scanf("%d%d",&n,&m),n||m){
        L(i, 0, n)scanf("%s",g[i]);
        state st={-1},end;
        L(i, 0, n)
            L(j, 0, m){
                if(g[i][j]=='X'&&st.x==-1){
                    st={i,j};
                    if(g[i][j+1]=='X')st.lie=1;
                    else if(g[i+1][j]=='X')st.lie=2;
                    else st.lie=0;
                }
                if(g[i][j]=='O')end={i,j,0};
            }
        int t=bfs(st, end);
        if(t==-1)puts("Impossible");
        else{
            printf("%d\n",t);
            auto[x,y,lie]=end;
            vector<int>l;
            while(dire[lie][x][y]!=-1){
                l.push_back(dire[lie][x][y]);
                auto now=pre[lie][x][y];
                x=now.x,y=now.y,lie=now.lie;
                // auto[x,y,lie]=now;
            }
            reverse(l.begin(), l.end());
            for(int v:l)printf("%s",s[v].c_str());
            puts("");
        }
    }
    return 0;
}

请问上述代码的第70行换成第71行注释的内容时,为什么会造成死循环。

题目:https://www.acwing.com/problem/content/174/

  • 写回答

1条回答 默认 最新

  • GIS工具开发 2023-05-12 08:25
    关注

    没有打破循环条件

    评论

报告相同问题?

问题事件

  • 创建了问题 5月11日

悬赏问题

  • ¥15 c++的教材订购系统的订购模块显示运行不出来
  • ¥15 Coze智能助手搭建过程中的问题请教
  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值