题目连接:POJ 2488
/*这题属于最基础的搜索题,在平时的联系中遇到过很多次,
然而每次都放弃了,这次终于耐心的把它敲出来了,
看上去好懂,其实敲起来并不容易,卡了好多次才A掉
AC代码如下:
*/
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=30;
int p,q,flag;
int dir[8][2]= {{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}}; //8个方向的位移量 (切记:字典序!!!)
int mark[maxn][maxn],a[maxn][2];
int find(int x,int y,int cnt)
{
int dx,dy;
if(cnt==q*p) //全部访问完毕,打印结果
{
for(int i=0; i<cnt; i++)
{
printf("%c%d",a[i][0]+'A',a[i][1]+1);
}
printf("\n\n");
flag=1; //记得标记下
}
else
{
for(int i=0; i<8; i++)
{
dx=x+dir[i][0];
dy=y+dir[i][1];
if(dx>=0 && dy>=0 && dx<q && dy<p && !mark[dx][dy] && !flag)
{
mark[dx][dy]=1; //标记已访问的点
a[cnt][0]=dx;
a[cnt][1]=dy; //记录访问点的坐标
find(dx,dy,cnt+1);
mark[dx][dy]=0; //清除标记,为下一次访问做准备
}
}
}
}
int main()
{
int t,cas=1;
scanf("%d",&t);
while(t--)
{
memset(mark,0,sizeof(mark));
memset(a,-1,sizeof(a));
scanf("%d%d",&p,&q);
printf("Scenario #%d:\n",cas++);
flag=0;
a[0][0]=0;a[0][1]=0;
mark[0][0]=1;
find(0,0,1);
if(!flag)
printf("impossible\n\n");
}
return 0;
}