Poj 2488 DFS

题目大意:象棋中,马只能走‘日’,给一个q*p的地图,问马能否走完所有的格子,并且输入路径(注意字典序)。
DFS模板题没啥好说的,注意字典序就行 要不指定过不了。。。

附AC代码

#include<iostream>
#include<queue>
using namespace std;
#define DirMax 8
#define MapMax 50
int DirY[DirMax] = { -2,-2,-1,-1,1,1,2,2 };
int DirX[DirMax] = { -1,1,-2,2,-2,2,-1,1 };
bool IsEnd;
bool IsPosTrue(int X, int Y,const int MaxN,const int MaxM)
{
	if (X >= MaxN || X < 0 || Y >= MaxM || Y < 0)
	{
		return false;
	}
	return true;
}

void DFS_Fun(int CurX,int CurY,const int MaxN,const int MaxM,bool MapMark[][50],int *MapIndex,int &nIndex)
{
	if (nIndex == MaxN * MaxM - 1)
	{
		IsEnd = true;
		return;
	}
	if (IsEnd)
	{
		return;
	}
	for (int i = 0; i < DirMax; i++)
	{
		int NextX = CurX + DirX[i];
		int NextY = CurY + DirY[i];
		if (IsEnd)
		{
			return;
		}
		if (IsPosTrue(NextX, NextY, MaxN, MaxM))
		{
			if (MapMark[NextX][NextY] == false)
			{
				MapMark[NextX][NextY] = true;
				MapIndex[nIndex] = i;
				++nIndex;
				if (nIndex == MaxN * MaxM - 1)
				{
					IsEnd = true;
					return;
				}
				DFS_Fun(NextX, NextY, MaxN, MaxM, MapMark, MapIndex,nIndex);
				nIndex--;
				MapMark[NextX][NextY] = false;
			}
		}
	}
}
int main()
{
	int MaxN, MaxM;
	int nNum;
	bool MapMark[MapMax][MapMax];//是否走过该点
	int StepIndex[MapMax*MapMax];
	while (cin >> nNum)
	{
		int PrintIndex = 0;
		while (nNum--)
		{
			IsEnd = false;
			int nIndexCount = 0;
			memset(MapMark, 0, sizeof(MapMark));
			memset(StepIndex, 0, sizeof(StepIndex));
			MapMark[0][0] = true;
			cin >> MaxN >> MaxM;
			DFS_Fun(0, 0, MaxN, MaxM, MapMark, StepIndex, nIndexCount);

			int CurX = 0, CurY = 0;
			printf("Scenario #%d:\n", ++PrintIndex);
			if (IsEnd)
			{
				for (int i = 0; i < MaxN*MaxM; i++)
				{
					printf("%c%d", CurY + 'A', CurX + 1);
					CurX += DirX[StepIndex[i]];
					CurY += DirY[StepIndex[i]];
				}
			}
			else
			{
				printf("impossible");
			}
			printf("\n\n");
		}
	}
}

猜你喜欢

转载自blog.csdn.net/RoronoaDZoro/article/details/91959079