求助
查看原帖
求助
443023
chenkuo楼主2023/10/17 20:34

万绿丛中一点红 95分 错了第10个点

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,z,a[101][101],mf[101][101],tu[101][101];
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int check(int x,int y){
	int ans=0;
	for(int i=0;i<4;i++) if(a[x+dx[i]][y+dy[i]]) ans++;
	if(ans>1) return 1;return 0;
}
struct asd{
	int x,y,color,money;
};
asd cr(int a,int b,int c,int d){
	asd q;
	q.x=a;q.y=b;q.color=c;q.money=d;
	return q;
}
int main(){
//	freopen("chess.in","r",stdin);
//	freopen("chess.out","w",stdout);
	scanf("%d%d",&m,&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d%d",&x,&y,&z);
		a[x][y]=z+1;
	}//cout<<endl;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=m;j++){
			tu[i][j]=1e8;
			if(a[i][j]) mf[i][j]=1;
			else mf[i][j]=check(i,j);
			//cout<<a[i][j]<<" ";
		}//cout<<endl;
	}//cout<<endl;
	queue<asd>q;mf[m][m]=1;
	q.push(cr(1,1,a[1][1],0));tu[1][1]=0;
	while(!q.empty()){
		int x=q.front().x,y=q.front().y,color1=q.front().color,money1=q.front().money;q.pop();
		for(int i=0;i<4;i++){
			int lx=x+dx[i],ly=y+dy[i],money=money1,color=color1;
			if(!mf[lx][ly]||lx<1||lx>m||ly<1||ly>m) continue;
			if(!a[lx][ly]) money+=2;
			else if(color!=a[lx][ly]) color=a[lx][ly],money++;
			if(money>=tu[lx][ly]) continue;
			tu[lx][ly]=money;
			q.push(cr(lx,ly,color,money));
		}
	}
//	for(int i=1;i<=m;i++){
//		for(int j=1;j<=m;j++) cout<<tu[i][j]<<" ";cout<<endl;
//	}
	if(tu[m][m]==1e8) printf("-1");
	else printf("%d",tu[m][m]);
}
2023/10/17 20:34
加载中...