BFS过了???能不能Hack???
查看原帖
BFS过了???能不能Hack???
556362
Unnamed114514楼主2023/6/20 21:39

题解是建图

#include<bits/stdc++.h>
using namespace std;
const int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int n,m,sx,sy,tx,ty;
char s[505][505];
bool vis[505][505];
struct node{
	int x,y,step;
	inline bool operator <(const node &o) const{
		return step>o.step;
	}
};
priority_queue<node> q;
inline bool check(int x,int y){
	return x>=1&&x<=n&&y>=1&&y<=m;
}
inline void BFS(){
	q.push(node({sx,sy,0}));
	while(q.size()){
		node u=q.top();
		q.pop();
		if(u.x==tx&&u.y==ty){
			cout<<u.step<<endl;
			return;
		}
		if(vis[u.x][u.y])
			continue;
		vis[u.x][u.y]=1;
		int X[4],Y[4],cost=1e9;
		memset(X,-1,sizeof(X));
		memset(Y,-1,sizeof(Y));
		for(int i=0;i<4;++i){
			int dx=u.x+d[i][0],dy=u.y+d[i][1];
			if(!check(dx,dy))
				continue;
			if(s[dx][dy]=='#'){
				cost=0;
				continue;
			}
			q.push(node({dx,dy,u.step+1}));
			int cnt=1;
			while(check(dx+d[i][0],dy+d[i][1])&&s[dx+d[i][0]][dy+d[i][1]]!='#'){
				++cnt;
				dx+=d[i][0],dy+=d[i][1];
			}
			X[i]=dx,Y[i]=dy,cost=min(cost,cnt);
		}
		if(cost==1e9)
			continue;
		for(int i=0;i<4;++i)
			if((~X[i])&&(~Y[i]))
				q.push(node({X[i],Y[i],u.step+cost+1}));
	}
	puts("nemoguce");
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j){
			cin>>s[i][j];
			if(s[i][j]=='C')
				sx=i,sy=j;
			if(s[i][j]=='F')
				tx=i,ty=j;
		}
	BFS();
	return 0;
} 
2023/6/20 21:39
加载中...