一片黑,求调
查看原帖
一片黑,求调
759120
luogu_MeiFengqi楼主2024/8/18 10:47
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f
int a[110][110];
int dis[110][110];
int dx[]={0,0,-1,1,1,1,-1,-1,0,0,-2,2};
int dy[]={1,-1,0,0,1,-1,1,-1,2,-2,0,0};
int dv[]={0,0,0,0,2,2,2,2,2,2,2,2};
int m,n;

inline int read()
{
	int x=0;
	char ch=getchar();
	while(ch>57||ch<48) ch=getchar();
	while(ch>=48&&ch<=57)
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x;
}
inline void write(int x)
{
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
struct node{
	int x,y,v;
	int c;
	bool operator <(const node &a)const{
		return a.v<v;
	}
};

priority_queue<node> q;
bool check(int x,int y)
{
	if(x<=0||y<=0||x>m||y>m) return 0;
	return 1;
}
int bfs()
{
	memset(dis,INF,sizeof dis);
	q.push({1,1,0,a[1][1]});
	while(!q.empty())
	{
		node cur=q.top(); q.pop();
		int nx=cur.x,ny=cur.y,nv=cur.v,nc=cur.c;
		if(dis[nx][ny]<nv) continue;
		//cout << nv << " " << nx << " " << ny << endl;
		for(int i=0;i<12;i++)
		{
			int cx=nx+dx[i],cy=ny+dy[i],cv=nv+dv[i],cc=a[cx][cy];
			if(!check(cx,cy)) continue;
			if(!cc) continue;
			if(nc!=cc) cv++;
			if(dis[cx][cy]>cv){
				dis[cx][cy]=cv;
				q.push({cx,cy,cv,cc});
			}
		}
	}
} 
signed main()
{
	m=read(); n=read();
	cin >> m >> n;
	while(n--)
	{
		int x,y,c;
		x=read();y=read();c=read();
		a[x][y]=c+1;
	}
	bfs();
	
	if(!a[m][m])
	{
		int ans=min(dis[m][m-1],dis[m-1][m])+2;
		if(ans>=INF) write(-1);
		else write(ans);
	}
	else
	{
		if(dis[m][m]>=INF) write(-1);
		else write(dis[m][m]);
	}
	return 0;
}

照着第一篇题解改了半天,变全黑了,在线求调

2024/8/18 10:47
加载中...