那个 $freopen$ 是后来调代码的时候加上的,不要在意 qwq
by Berlin_Jacor @ 2020-06-16 19:32:26
*码风出 $bug$ 是因为 $2Tabsize$ 空格缩进被 $luogu$ 强制转化为 $6Tabsize$ $tab$ 缩进,勿喷qwq
by Berlin_Jacor @ 2020-06-16 19:44:18
刚发讨论就被机房神仙调出来了!!!
在这里跟大家分享一下
就是说当传送过去以后,可能再一次被传送过去的字母旁边的点覆盖(重复入队)导致比答案多1。
by Berlin_Jacor @ 2020-06-16 20:16:58
这是AC代码:
```cpp
#include <bits/stdc++.h>
using namespace std;
int n, m, dx[] = {0, -1, 1, 0}, dy[] = {1, 0, 0, -1};
char a[305][305];
int dis[305][305];
int visx[305], visy[305], px[305][305], py[305][305];
bool v[100], vis[305][305];//传送回来的时候和dis不一样,不能两个都标记啊,阿sir
queue<pair<int,int> >q;
int main()
{
ios::sync_with_stdio(0);
cin.tie(NULL),cout.tie(NULL);
cin>>n>>m;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
{
cin>>a[i][j];
if(a[i][j] == '=')
{
q.push(make_pair(i,j));
vis[i][j] = 1;
}
if(a[i][j] >= 'A' && a[i][j] <= 'Z')
if(v[a[i][j] - 'A'])
{
px[i][j] = visx[a[i][j] - 'A'],
py[i][j] = visy[a[i][j] - 'A'],
px[visx[a[i][j] - 'A']][visy[a[i][j] - 'A']] = i,
py[visx[a[i][j] - 'A']][visy[a[i][j] - 'A']] = j;
}
else v[a[i][j] - 'A'] = 1, visx[a[i][j] - 'A'] = i, visy[a[i][j] - 'A'] = j;
}
while(q.size())
{
for(int i = 0; i < 4; ++i)
{
int x=q.front().first + dx[i],
y=q.front().second + dy[i];
if(vis[x][y])continue;
vis[x][y] = 1;
if(a[x][y] == '#')continue;
if(x < 1 || y < 1 || x > n || y > m)continue;
if(a[x][y] >= 'A' && a[x][y] <= 'Z')
{//存在重复标记字母位置的dis并重复入队导致dis多1!!!
dis[px[x][y]][py[x][y]] = dis[q.front().first][q.front().second] + 1;
q.push(make_pair(px[x][y], py[x][y]));
}
else
{
dis[x][y] = dis[q.front().first][q.front().second] + 1;
if(a[x][y] == '@'){cout<<dis[x][y];return 0;}
else q.push(make_pair(x, y));
}
}
q.pop();
}
}
```
by Berlin_Jacor @ 2020-06-16 20:17:57
orz%%%
by uliahradri @ 2020-06-16 21:45:00
@[玄离の小黑](/user/221610) 那个,楼主的意思是如果从传送门a1到a2之后可以一步不走再从a2到a1吗
by 仙女杰瑞 @ 2020-08-24 06:05:34
@[仙女杰瑞](/user/277682) 不是的,我的意思是我的代码有锅,存在一种可能,a2入队后再一次被附近点的step更新时覆盖。
by Berlin_Jacor @ 2020-08-24 15:48:57
@[枫楠](/user/221610) 我也是没注意到这个点,感谢遇见
by lyu201909250425 @ 2020-10-01 12:22:12