bfs70分,求调
查看原帖
bfs70分,求调
750689
CNzzc楼主2024/9/28 18:32
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define up(i,j,k,l) for(int i=j;i<=k;i+=l)
#define down(i,j,k,l) for(int i=j;i>=k;i-=l)
using namespace std;
const int N=1e3+2e2+10;
int n;
char a[N][N];
struct node{
	int x,y;
	ll t;
};
priority_queue<node> q;
bool f[N][N];
int u,v,w;
ll b1,b2,b3,ans;
bool operator<(node x1,node x2)
{
	return x1.t<x2.t;
}
inline bool check(int x,int y)
{
	if(x<1 || y<1 || x>n || y>n || f[x][y]==true || a[x][y]=='*'){
		return false;
	}
	else{
		return true;
	}
}
ll bfs(int x,int y)
{
	up(i,0,N-1,1){
		up(j,0,N-1,1){
			f[i][j]=false;
		}
	}
	while(!q.empty()){
		q.pop();
	}
	q.push({x,y,1});
	f[x][y]=true;
	while(!q.empty()){
		//cout<<x<<' '<<y<<endl;
		u=q.top().x;
		v=q.top().y;
		w=q.top().t;
		q.pop();
		if(u==n && v==n){
			return w;
		}
		if(a[u][v]=='A'){
			if(check(u+1,v)){
				f[u+1][v]=true;
				q.push({u+1,v,w+1});
			}
			if(check(u-1,v)){
				f[u-1][v]=true;
				q.push({u-1,v,w+1});
			}		
			if(check(u,v+1)){
				f[v][u+1]=true;
				q.push({u,v+1,w+1});
			}
			if(check(u,v-1)){
				f[u][v-1]=true;
				q.push({u,v-1,w+1});
			}
		}
		else if(a[u][v]=='B'){
			if(check(u+2,v) && a[u+1][v]!='#'){
				f[u+2][v]=true;
				q.push({u+2,v,w+1});
			}
			if(check(u-2,v) && a[u-1][v]!='#'){
				f[u-2][v]=true;
				q.push({u-2,v,w+1});
			}		
			if(check(u,v+2) && a[u][v+1]!='#'){
				f[u][v+2]=true;
				q.push({u,v+2,w+1});
			}
			if(check(u,v-2) && a[u][v-1]!='#'){
				f[u][v-2]=true;
				q.push({u,v-2,w+1});
			}
		}
		else if(a[u][v]=='C'){
			if(check(u-1,v-1)){
				f[u-1][v-1]=true;
				q.push({u-1,v-1,w+1});
			}
			if(check(u-1,v+1)){
				f[u-1][v+1]=true;
				q.push({u-1,v+1,w+1});
			}
			if(check(u+1,v-1)){
				f[u+1][v-1]=true;
				q.push({u+1,v-1,w+1});
			}
			if(check(u+1,v+1)){
				f[u+1][v+1]=true;
				q.push({u+1,v+1,w+1});
			}
		}
	}
	return LLONG_MAX;
}
void solve()
{
	cin>>n;
	up(i,1,n,1){
		up(j,1,n,1){
			cin>>a[i][j];
		}
	}
	b1=bfs(1,1);
	b2=bfs(1,n);
	b3=bfs(n,1);
	ans=LLONG_MAX;
	ans=min({ans,b1,b2,b3});
	if(ans==LLONG_MAX){
		cout<<"No answer";
	}
	else{
		cout<<ans;
	}
	cout<<endl;
	return;
}
int main()
{
    //ios::sync_with_stdio(false);
	//cin.tie(0);
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	int _=1;
	//cin>>_;
	up(i,1,_,1){
		solve();
	}
	return 0;
}
2024/9/28 18:32
加载中...