题目大意:
给你一个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 #"<