题目大意:象棋中,马只能走‘日’,给一个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");
}
}
}