不大明白为什么稍微改一下就94→100了
查看原帖
不大明白为什么稍微改一下就94→100了
150064
Gokix楼主2021/5/13 21:24

思路就是最简单的bfs

但是把这个程序里注释掉的那句话不注释就会WA on #6,输出比答案多1。我看讨论区也有大佬提出这个问题,但是没看懂这位大佬说的什么……-_-||

我觉得传送门两端的距离都应该更新啊?为什么只应该更新传送后的距离呢?

有没有神仙帮忙解释一下啊?多谢了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

long long n,m,f[310][310],vis[310][310],x0,y0,x1,y1,d[30][3][3];
const long long dx[5]={0,0,1,-1},dy[5]={1,-1,0,0};
char a[310][310];
struct node{
	long long x,y;
};
queue <node> q;

int main(){
	long long i,j,u,v,k,xx,yy,gx;
	cin>>n>>m;
	for(i=1;i<=n;i++){
		for(j=1;j<=m;j++){
			cin>>a[i][j];
			if(a[i][j]=='='){
				x0=i;
				y0=j;
				a[i][j]='.';
			}
			if(a[i][j]=='@'){
				x1=i;
				y1=j;
			}
			if('A'<= a[i][j] && a[i][j]<='Z'){
				if(d[a[i][j]-'A'+1][0][0]==0){
					d[a[i][j]-'A'+1][0][0]=i;
					d[a[i][j]-'A'+1][0][1]=j;
				}
				else{
					d[a[i][j]-'A'+1][1][0]=i;
					d[a[i][j]-'A'+1][1][1]=j;
				}
			}
		}
	}
	memset(f,0x3f,sizeof(f));
	memset(vis,0,sizeof(vis));
	f[x1][y1]=0;
	vis[x1][y1]=1;
	q.push(node{x1,y1});
	while(!q.empty()){
		node now=q.front();
		q.pop();
		u=now.x;
		v=now.y;
		for(k=0;k<4;k++){
			xx=u+dx[k];
			yy=v+dy[k];
			if(a[xx][yy]=='.' && !vis[xx][yy]){
				f[xx][yy]=f[u][v]+1;
				vis[xx][yy]=1;
				q.push(node{xx,yy});
			}
			if('A'<=a[xx][yy] && a[xx][yy]<='Z' && !vis[xx][yy]){
				//f[xx][yy]=f[u][v]+1;
				vis[xx][yy]=1;
				gx=a[xx][yy]-'A'+1;
				if(d[gx][0][0]==xx && d[gx][0][1]==yy){
					xx=d[gx][1][0];
					yy=d[gx][1][1];
					f[xx][yy]=f[u][v]+1;
				}
				else{
					xx=d[gx][0][0];
					yy=d[gx][0][1];
					f[xx][yy]=f[u][v]+1;
				}
				q.push(node{xx,yy});
			}
			if(xx==x0 && yy==y0){
				break;
			}
		}
	}
	cout<<f[x0][y0]<<endl;
	return 0;
}
2021/5/13 21:24
加载中...