模仿题解写的,85分哪里错了?
查看原帖
模仿题解写的,85分哪里错了?
704634
poor_OIer楼主2022/8/23 18:00
#include<bits/stdc++.h>
using namespace std;
int n,m,color[1100][1100];
int flag[1100][1100];
int d[1100][1100];
int dx[4]={-1,0,0,1};
int dy[4]={0,-1,1,0};
int minn=0x7f;
bool check(int x,int y)
{
	if(x<1||x>n||y<1||y>n)
		return false;
	return true;
}
void dfs(int x,int y,int coin,int last_color)
{
	if(x==n&&y==n)
	{
		minn=min(coin,minn);
		return;
	}
	for(int i=0;i<4;i++)
	{
		int nx=dx[i]+x;
		int ny=dy[i]+y;
		if(check(nx,ny)==true)
		{
			if(flag[nx][ny]==0)
			{
				if(color[x][y]!=0||color[nx][ny]!=0)
				{
					if(color[nx][ny]==0)
					{
						if(coin+2<d[nx][ny])
						{
							flag[nx][ny]=1;
							d[nx][ny]=coin+2;
							dfs(nx,ny,coin+2,last_color);
							flag[nx][ny]=0;
						}
					}
					else
					{
						if((last_color==color[nx][ny])&&(coin<d[nx][ny]))
						{
							flag[nx][ny]=1;
							d[nx][ny]=coin;
							dfs(nx,ny,coin,last_color);
							flag[nx][ny]=0;
						}
						else if((coin+1<minn)&&(coin+1<d[nx][ny]))
						{
							flag[nx][ny]=1;
							d[nx][ny]=coin+1;
							dfs(nx,ny,coin+1,color[nx][ny]);
							flag[nx][ny]=0;
						}
					}
				} 
			}
		}
	}
}
int main()
{
	cin>>n>>m;
	memset(d,0x7f,sizeof(d));
	memset(flag,0,sizeof(flag));
	memset(color,0,sizeof(color));
	for(int i=1;i<=m;i++)
	{
		int cx,cy,cc;
		cin>>cx>>cy>>cc;
		color[cx][cy]=cc+1;
	}
	flag[1][1]=1;
	dfs(1,1,0,color[1][1]);
	if(minn==0x7f)
		cout<<-1;
	else
		cout<<minn;
	return 0;
}
2022/8/23 18:00
加载中...