你的代码`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