求指点,66分求助QAQ
查看原帖
求指点,66分求助QAQ
666940
Wufei_OvO楼主2024/1/28 10:53

求大佬指点

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int Maxn = 1e3 + 3;
int N,M;
int Dir_X[5] = {0,1,-1,0,0};
int Dir_Y[5] = {0,0,0,1,-1};
bool Vis[Maxn][Maxn];
bool Vis2[Maxn][Maxn];
char Box[Maxn][Maxn];
int Line_Num = 1;
bool F;
struct Line
{
	int Start_X,Start_Y,End_X,End_Y;
}L[Maxn * Maxn];
int Sum = INT_MAX;
int Cont = 0;
void DFS(int X,int Y,int Cnt)
{
	Cnt += 1;
	for(int i = 1;i <= Line_Num;i++)
	{
		if(L[i].Start_X == X && L[i].Start_Y == Y && !Vis2[L[i].End_X][L[i].End_Y])
		{
			Vis2[L[i].End_X][L[i].End_Y] = true;
			//cout << "----------------" << endl;
			Cont++;
			if(L[i].End_X == N)
			{
				F = true;
				Sum = min(Sum,Cont);
				//cout << Cont << "!!!!!!!!!!!!!!!!!" << endl;
			}
			//cout << Cont << " " << Cnt << " : " << L[i].Start_X << " " << L[i].Start_Y << " " << L[i].End_X << " " << L[i].End_Y << endl;
			//cout << "----------------" << endl;
			DFS(L[i].End_X,L[i].End_Y,Cnt + 1);
			Cont--;
		}
	}
	return ;
}
int main()
{
	cin >> N >> M;
	for(int i = 1;i <= N;i++)
	{
		for(int j = 1;j <= M;j++)
		{
			cin >> Box[i][j];
		}
	}
	Box[1][1] = '#';
	L[1].Start_X = N;
	L[1].Start_Y = 1;
	L[1].End_X = N;
	L[1].End_Y = M;
	for(int i = 1;i <= M;i++)
	{
		if(Box[N][i] == '#')
		{
			Line_Num += 1;
			L[Line_Num].Start_X = N;
			L[Line_Num].End_X = N;
			L[Line_Num].Start_Y = i;
			L[Line_Num].End_Y = M;
		}
	}
	for(int i = 1;i <= Line_Num;i++)
	{
		for(int n = L[i].Start_X;n <= L[i].End_X;n++)
		{
			for(int m = L[i].Start_Y;m <= L[i].End_Y;m++)
			{
				if(Box[n][m] == '#' && !Vis[n][m])
				{
					Vis[n][m] = true;
					for(int P = 1;P <= 4;P++)
					{
						int XX = n,YY = m;
						int End_X = -1,End_Y = -1;
						while(XX >= 1 && XX <= N && YY >= 1 && YY <= M)
						{
							XX += Dir_X[P];
							YY += Dir_Y[P];
							if(Box[XX][YY] == '#')
							{
								End_X = max(n,XX);
								End_Y = max(m,YY);
							}
						}
						if(End_X != -1 && End_Y != -1)
						{
							if(XX < 1)
							{
								XX = 1;
							}
							if(XX > N)
							{
								XX = N;
							}
							if(YY < 1)
							{
								YY = 1;
							}
							if(YY > M)
							{
								YY = M;
							}
							Line_Num += 1;
							L[Line_Num].Start_X = min(n,XX);
							L[Line_Num].End_X = End_X;
							L[Line_Num].Start_Y = min(m,YY);
							L[Line_Num].End_Y = End_Y;
						}
					}
				}
			}
		}
	}
	DFS(1,1,0);
	for(int i = 1;i <= Line_Num;i++)
	{
		//cout << L[i].Start_X << " " << L[i].Start_Y << " " << L[i].End_X << " " << L[i].End_Y << endl;
	}
	if(F)
	{
		cout << Sum;
	}else
	{
		cout << -1;
	}
}
2024/1/28 10:53
加载中...