题意:给出一个国际棋盘的大小 p*q,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径。
因为要求字典序输出最小,所以按下图是搜索的次序搜素出来的就是最小的。
初始方向数组:int f[2][8]={{-2,-2,-1,-1, 1,1, 2,2}, {-1, 1,-2, 2,-2,2,-1,1}};
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int q,p,vis[30][30],flag;
int f[2][8]={{-2,-2,-1,-1, 1,1, 2,2},
{-1, 1,-2, 2,-2,2,-1,1}};
struct node{
int x,y;
}mp[30];
void dfs(int x,int y,int step,int t)
{
if(flag) return;
vis[x][y]=1;
mp[step].x=x;
mp[step].y=y;
if(step==p*q&&flag==0)
{
flag=1;
printf("Scenario #%d:\n",t);
for(int i=1;i<=step;i++)
{
char c = mp[i].x-1+'A';
cout<<c<<mp[i].y;
}
printf("\n\n");return;
}
for(int i=0;i<8;i++)
{
int nx = x+f[0][i];
int ny = y+f[1][i];
if(!vis[nx][ny] && nx>=1 && nx<=q && ny>=1 && ny<=p)
dfs(nx,ny,step+1,t);
}
vis[x][y]=0;
}
int main()
{
int T;cin>>T;
for(int i=1;i<=T;i++)
{
cin>>p>>q;
memset(vis,0,sizeof(vis));
flag=0;
dfs(1,1,1,i);
if(!flag)
{
printf("Scenario #%d:\nimpossible\n\n",i);
}
}
return 0;
}