题目大意:

给你一个m*n的象棋棋盘,然后问你一个马,是否可以跳遍每一个格(每个格只跳一次)。如果可以,按照字典序输出跳跃顺序;

既然是要按照字典序,肯定第一个输出的是A1。然后通过调整move[][2]数组,找到合适的跳跃顺序,以达到得到的跳跃顺序为字典序最小的目的。(注:dfs找到一个解之后,跳过所有循环,直接跳出到递归函数的最外层)

字典序最小的跳跃顺序如图所示:


include
#include
#include
#define N 30
using namespace std;
int m,n;
bool vis[N][N]={0};
struct point
{
	int x;int y;
}poi[N*N]={0};
int move[][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
int flag=0;
int s=1;
void dfs(int x,int y)
{
	if(s==m*n)
	{
		flag=1;
		return;
	}
	for(int i=0;i<8;i++)
	{
		int xx,yy;
		xx=x+move[i][0];
		yy=y+move[i][1];
		if(xx<=0||xx>n||yy<=0||yy>m)continue;
		if(vis[xx][yy]==1)continue;
		poi[s].x=xx;
		poi[s].y=yy;
		s++;
		vis[xx][yy]=1;
		dfs(xx,yy);
		if(flag==1)return;
		vis[xx][yy]=0;
		s--;
	}
	return;
}

int main()
{
	int ci=1;
	int test;
	cin>>test;
	while(test--)
	{
		memset(vis,0,sizeof(vis));
		memset(poi,0,sizeof(poi));
		cin>>n>>m;//int char
		flag=0;
		s=1;
		poi[0].x=1;
		poi[0].y=1;
		vis[1][1]=1;
		/*queueq;
		point l;
		l.x=1;
		l.y=1;
		q.push(l);
		vis[1][1]=1;
		int s=0;
		poi[s].x=1;
		poi[s].y=1;
		s++;
		while(!q.empty())
		{
			for(int i=0;i<8;i++)
			{
				point t;
				t.x=q.front().x+move[i][0];
				t.y=q.front().y+move[i][1];
				if(t.x<=0||t.x>n||t.y<=0||t.y>m)continue;
				if(vis[t.x][t.y]==1)continue;
				vis[t.x][t.y]=1;
				q.push(t);
				poi[s].x=t.x;
				poi[s].y=t.y;
				s++;
			}
			q.pop();
		}*/
		dfs(1,1);
		cout<<"Scenario #"<