蒟蒻BFS玄关求调WATLE30pts
查看原帖
蒟蒻BFS玄关求调WATLE30pts
1283951
csxx601cjy楼主2024/11/30 18:35

这题BFS一定要使用优先队列优化吗?谁能教一教我

#include<bits/stdc++.h>
#define up(x,y) for(int i=x;i<=y;i++)
#define pii pair<int,int>
#define mp(x,y) make_pair(x,y)
#define st first
#define nd second
using namespace std;
int a[111][111],b[111][111],dis[111][111],m,n,x,y,c;
int dir[2][4]={{0,1,0,-1},{1,0,-1,0}};
const int inf=0x3f;
queue<pii>q;
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	memset(dis,inf,sizeof dis);
	dis[1][1]=0;
	cin>>m>>n;
	up(1,n){
		cin>>x>>y>>c;
		a[x][y]=c+1;
	}
	q.push(mp(1,1));
	while(!q.empty()){
		pii now=mp(q.front().st,q.front().nd);
		int nx,ny,cost=0;
		q.pop();
		up(0,3){
			nx=now.st+dir[0][i];
			ny=now.nd+dir[1][i];
			if(nx<1||nx>m||ny<1||ny>m)continue;
			
			if(!a[nx][ny]&&!a[now.st][now.nd])continue;//不能连续使用魔法
			if(!a[nx][ny])cost=2,b[nx][ny]=a[now.st][now.nd];//走到无色方块,使用了魔法
			else if(a[nx][ny]!=a[now.st][now.nd]&&a[now.st][now.nd])cost=1;//从有色方块走到异色方块
			else if(!a[now.st][now.nd]&&b[now.st][now.nd]!=a[nx][ny])cost=1;//从魔法方块走到异色方块
			
			if(dis[now.st][now.nd]+cost<=dis[nx][ny])dis[nx][ny]=dis[now.st][now.nd]+cost;
			else continue;
			q.push(mp(nx,ny));
		}
	}
	/*
	cout<<endl;
	up(1,m){
		for(int j=1;j<=m;j++)cout<<a[i][j]<<'\t';
		cout<<endl;
	}
	cout<<endl;
	up(1,m){
		for(int j=1;j<=m;j++)cout<<(dis[i][j]<inf?dis[i][j]:-1)<<'\t';
		cout<<endl;
	}
	*/
	cout<<(dis[m][m]<inf?dis[m][m]:-1);
	return 0;
}
2024/11/30 18:35
加载中...