当前位置: 首页 > 知识库问答 >
问题:

c++ - auto为什么会导致死循环?

柳弘方
2023-05-13
#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/

共有2个答案

龙承颜
2023-05-13
// ...
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;
}
// ...
梅宏盛
2023-05-13

auto 会声明新的变量,从而不会改变 while 循环外的 x,y,lie 的值。

while(....) 中的 x,y,lie 使用的 while 循环外的 x,y,lie ,在循环中不会被改变,于是就死循环了。

 类似资料:
  • 本文向大家介绍为什么JDK8中HashMap依然会死循环,包括了为什么JDK8中HashMap依然会死循环的使用技巧和注意事项,需要的朋友参考一下 JDK8中HashMap依然会死循环! 是否你听说过JDK8之后HashMap已经解决的扩容死循环的问题,虽然HashMap依然说线程不安全,但是不会造成服务器load飙升的问题。 然而事实并非如此。少年可曾了解一种红黑树成环的场景,=v= 今日在查看

  • 问题内容: 好吧,我试图理解并阅读可能导致它的原因,但我却无法理解: 我的代码中有这个地方: 事实是,当它尝试调用某些方法时,它将引发而不是其他预期的异常(特别是)抛出 。我实际上知道调用了什么方法,所以我直接转到该方法代码,并为应该抛出的行添加了一个块 ,它实际上按预期抛出。然而,当它上升时,以某种方式更改了上面的代码并没有 按预期进行。 是什么原因导致这种行为的?我该如何检查? 问题答案: 通

  • 我有一个看起来很简单的问题,但由于某种原因我无法绕过它。基本上我的程序正在导致一个无限循环,我不知道为什么。 下面是我陷入的特定循环: 当我运行它时,它总是问我输入列#。我给它一个数字,它接受这个数字,$response变为True,但while循环继续运行,就好像<code>的$response</code>为false一样。我是Perl新手,所以可能我遗漏了一些东西,但是($response=

  • 为什么我在下面的代码段中的X轴上有一个溢出? 在我的网格容器上应用时,就会产生溢出。 null null https://codepen.io/anon/pen/wdjexz?editors=1100

  • 问题内容: 即使模型类中没有验证约束,我也会收到此错误(所有成员变量均已正确设置,但我在创建对象时仍然遇到此异常)。如何调试此错误? 问题答案: 每个都有一个数组。每个显示了您要保留的bean的哪个属性被侵犯。正如@Arthur正确指出的那样,违反Java持久性注释的结果也以s 结尾。 要调试你的问题,我会暂时赶在并打印出每个如下:

  • 我正在Drools中编写一个规则集,以下情况会通过重新触发规则导致无限循环: 以下规则更改不会导致无限循环,即当ObjectB中不再引用a1时: 另一种不会导致无限循环的情况是当我将更改为 将“触发重新评估知识库中匹配对象类型的所有模式”,但由于我正在修改的字段field3没有在LHS条件中使用,我认为不应该重新评估。然而,我不能肯定这与引用a1有关。字段1位于ObjectB中,但我找不到具体的原