样例过了,wa
查看原帖
样例过了,wa
865398
renjunxin0721楼主2023/11/16 17:02
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct node{int x,y,m;};
string mp[310];
int vis[310][310];
int n,m,ix,iy,dx,dy,ans=114514;
int idx[4]={1,-1,0,0};
int idy[4]={0,0,1,-1};
queue<node> q;
node go_to(char a,int x,int y){
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(mp[i][j]==a&&i!=x&&j!=y)return node{i,j};
		}
	}
}
bool ifgo(int a,int b){
	if(a<0||a>=n||b<0||b>=m||mp[a][b]=='#'||vis[a][b])return 0;
	return 1;
}
int main(){
	//freopen("P1825_2.in","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++){
		cin>>mp[i];
		for(int k=0;k<m;k++){
			if(mp[i][k]=='@')ix=i,iy=k;
			if(mp[i][k]=='=')dx=i,dy=k;
		}
	}
	cout<<ix<<" "<<iy<<endl;
	q.push(node{ix,iy,0});vis[ix][iy]=1;
	while(!q.empty()){
		node t=q.front();
		q.pop();
		if(t.x==dx&&t.y==dy){
			ans=min(t.m,ans);
		}
		for(int i=0;i<4;i++){
			int x=t.x+idx[i],y=t.y+idy[i];
			if(!ifgo(x,y))continue;
			vis[x][y]=1;
			cout<<x<<" "<<y<<" "<<mp[x][y]<<" "<<t.m+1<<endl;
			q.push(node{x,y,t.m+1});
			if(mp[x][y]>='A'&&mp[x][y]<='Z'){
				node g=go_to(mp[x][y],x,y);
				int a=g.x,b=g.y;
				if(!ifgo(a,b))continue;
				vis[a][b]=1,q.push(node{a,b,t.m+1});
				cout<<a<<" "<<b<<" "<<mp[a][b]<<" "<<t.m+1<<endl;
			}
		}
	}
	printf("%d",ans);
}

自hack数据

7 5
#####
#BA.@
#.###
#.###
#B..=
#####
#A###
2023/11/16 17:02
加载中...