题意:一个骑士在n*m的棋盘上面走“日”,在(1,1)处开始,问怎么可以把棋盘走完,输出字典序最小的路径。
想法:设定八个方向,先搜索字典序小的方向。
#include<iostream>
#include<cstring>
#define judge(x,y) x>=1&&x<=n&&y>=1&&y<=m&&!vis[x][y]
using namespace std;
int n,m,cnt;
char path[10100];
bool vis[30][30],mark;
int dir[8][2]={-1,-2,1,-2,-2,-1,2,-1,-2,1,2,1,-1,2,1,2};
void dfs(int x,int y)
{
if(mark) return;
vis[x][y]=true;
path[++cnt]=y+'A'-1;
path[++cnt]=x+'0';
if(cnt==n*m*2)
{
mark=true;
return;
}
for(int i=0;i<8;i++)
{
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if(judge(tx,ty)&&!mark)
{
dfs(tx,ty);
cnt-=2;
vis[tx][ty]=false;
}
}
}
int main()
{
int t,ca=1;
cin>>t;
while(t--)
{
cin>>n>>m;
memset(vis,false,sizeof(vis));
memset(path,'\0',sizeof(path));
mark=false;
cnt=0;
dfs(1,1);
cout<<"Scenario #"<<ca++<<":"<<endl;
if(mark)
{
cout<<path+1<<endl<<endl;
}
else
{
cout<<"impossible"<<endl<<endl;
}
}
return 0;
}