poj2488(DFS+记录路线)
- 题目链接
- 题目大意: 在棋盘上骑士每次走的路线是向一个方向走两步垂直方向走一步,给定棋盘的大小问骑士能不能走遍棋盘,如果可以输出字典序最小路径
- 注意的点:
- STL里面queue是用push,pop,front,back
- stack是push,pop,top
- vector是insert,push_back(把元素插在最后),pop_back(删除最后一个元素),erase
- set是insert
- 记录路径的方法
- AC代码
using namespace std;
int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};
int vis[30][30],sum=0;
int path[150][2];
void dfs(int x,int y,int p,int q)
{
if(sum==p*q)
return;
for(int i=0;i<8;i++)
{
int newx=x+dir[i][0];
int newy=y+dir[i][1];
if(newx>=0&&newx<q&&newy>=0&&newy<p&&!vis[newx][newy])
{
int num=sum;
vis[newx][newy]=1;
// printf("%d %d\n",newx,newy);
path[sum][0]=newx+'A',path[sum][1]=newy+1;
sum++;
dfs(newx,newy,p,q);
if(sum==p*q)
return ;
vis[newx][newy]=0;
sum=num;
path[sum][0]=0,path[sum][1]=0;
}
}
}
int main()
{
int cnt=0,n;
scanf("%d",&n);
while(n--)
{
sum=0;
memset(path,0,sizeof(path));
memset(vis,0,sizeof(vis));
int p,q;
scanf("%d%d",&p,&q);
vis[0][0]=1;
path[0][0]='A',path[0][1]=1;
sum++;
dfs(0,0,p,q);
//printf("%d\n",sum);
printf("Scenario #%d:\n",++cnt);
if(sum==p*q)
{
for(int i=0;i<p*q;i++)
printf("%c%d",path[i][0],path[i][1]);
printf("\n");
}
else
{
printf("impossible\n");
}
printf("\n");
}
return 0;
}