P3956 棋盘 30分,谢谢大佬了%%%
查看原帖
P3956 棋盘 30分,谢谢大佬了%%%
450893
yangyuanxi44楼主2021/10/15 11:15

BFS30分,应该是向四个方向拓展判断有问题,求调(调吐了),谢谢大佬,谢谢了

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
int n,m,ans=1e18,value[1005][1005];//value是距离
struct node{
	int x,y,dis;//坐标,距离
};
struct node2{
	int z,b;//颜色,判断是否改变过颜色
}a[1005][1005];
queue<node> Q;
signed main(){
	cin>>n>>m;
	for(int i=1 ; i<=n ; i++)
	    for(int j=1 ; j<=n ; j++)
	        a[i][j].z=-1,a[i][j].b=0,value[i][j]=1e17;//初始化,颜色默认为-1(无颜色),默认为改变过颜色,距离初始化
	for(int i=1 ; i<=m ; i++){
		int u,v,w;
		cin>>u>>v>>w;
		a[u][v].z=w;//标记颜色
		a[u][v].b=1;//默认为未改变过
	}
	cout<<endl;
	value[1][1]=0; 
	Q.push((node){1,1,0}); 
	while(!Q.empty()){
		node p=Q.front();
		Q.pop();
		//cout<<p.x<<" "<<p.x<<" "<<p.dis<<endl;
		if(p.dis>ans)
		   continue;
		if(p.x==n&&p.y==n){
			ans=min(ans,p.dis);
			continue;
		}//bfs基本步骤
		for(int i=0 ; i<4 ; i++){
			int tx=p.x+dx[i],ty=p.y+dy[i];
			if(tx>n||ty>n||tx<1||ty<1)//判断越界 
			  continue;
			if((a[tx][ty].z!=a[p.x][p.y].z)&&a[tx][ty].z!=-1){
				if(value[tx][ty]>p.dis+1){//更新 
					Q.push((node){tx,ty,p.dis+1});
					value[tx][ty]=p.dis+1;
				}//第1种,颜色不一样(但都染色了)dis(金币加1)
			}else if(a[tx][ty].z==a[p.x][p.y].z){
				if(value[tx][ty]>p.dis){//更新 
					Q.push((node){tx,ty,p.dis});
					value[tx][ty]=p.dis;
				}//第2种,颜色一样(但都染色了)dis不变 
			}else if(a[tx][ty].z==-1&&a[p.x][p.y].b==1){
				if(value[tx][ty]>p.dis+2){//更新 
					Q.push((node){tx,ty,p.dis+2});
					value[tx][ty]=p.dis+2;
					a[tx][ty].z=a[p.x][p.y].z;//染色 
				}//第3种,要走的格子未染色,且现在站的格子不是经过魔法改变的,dis不变
			}else if(a[ty][tx].z==-1&&a[p.x][p.y].b==0)
			    continue;//第4种,要走的格子未染色,且现在站的格子是经过魔法改变的,continue	    
		}
	}
	if(ans==1e17)
	   cout<<-1;
	else
	   cout<<ans;
	return 0;
}
2021/10/15 11:15
加载中...