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;
}