求助 为啥这样写不对啊

P1747 好奇怪的游戏

你的代码`while(q.empty()) q.pop();`根本不是清空队列,你自己仔细瞧瞧改成`while(!q.empty()) q.pop();`。你是要找你的目标是找到从`(a, b)`到`(1, 1)`的最短路径,你的代码`if(x==1&&y==1) return d[x][y];`位置不对,它应该在更新`d[x][y]`之后立即检查,而不是放在循环的最后。在`bfs`函数的结尾,如果函数没有在循环中返回任何值(例如,当找不到到达`(1, 1)`的路径时),它将结束执行而没有返回值。这是未定义行为。你应该在函数末尾添加一个返回语句来处理这种情况。在遍历dx和dy时,你设定了`for(int i=0;i<15;i++)`,这意味着你试图访问`dx[14]`和`dy[14]`,但这两个数组的大小只有12,这会导致未定义行为,这个是关键问题。我改了一下你的代码,就能AC了。 ``` #include<bits/stdc++.h> using namespace std; #define x first #define y second const int N=105; typedef pair<int,int> pii; queue<pii> q; int xb,yb,xw,yw; int d[N][N]; // 正确设置方向数组的大小 int dx[12]={-2,-1,1,2,2,2,2,1,-1,-2,2,-2}, dy[12]={2,2,2,2,1,-1,-2,-2,-2,-2,1,-1}; int bfs(int a,int b) { // 清空队列的正确方式 while(!q.empty()) q.pop(); memset(d,-1,sizeof d); d[a][b]=0; q.push({a,b}); while(!q.empty()) { pii t=q.front(); q.pop(); // 遍历所有可能的移动方向 for(int i=0;i<12;i++) { // 正确的迭代次数 int x=t.first+dx[i],y=t.second+dy[i]; if(x<1||y<1||x>N||y>N||d[x][y]!=-1) continue; // 添加边界检查,避免数组越界 d[x][y]=d[t.first][t.second]+1; if(x==1&&y==1) return d[x][y]; // 立即检查是否达到目标 q.push({x,y}); } } // 如果无法到达(1, 1),返回-1或者其他表示无法到达的值 return -1; } int main() { cin>>xb>>yb>>xw>>yw; cout<<bfs(xb,yb)<<endl<<bfs(xw,yw); return 0; } ```
by dctc1494 @ 2024-03-02 08:17:19


真的是,写了个i<15自己都不知道
by dctc1494 @ 2024-03-02 08:18:30


@[dctc1494](/user/773235) 兄弟多谢了 这题大半夜写的 脑子昏昏的
by heyworld @ 2024-03-02 13:45:09


|