POJ 2488 A Knight's Journey
解题思路:深度优先搜索,考虑到字典顺序,需仔细设计方向顺序
bad
#include <iostream>
using namespace std;
int main()
{
int i,k,n,p,q,s,t,ci,cj,queue[27],ti,tj;
bool chess[26][26];
const int dir[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
char a,b;
scanf("%d",&n);
for(k=1;k<=n;k++)
{
scanf("%d %d", &p, &q);
memset(chess,0,sizeof(chess));
ci=cj=t=queue[0]=0;chess[0][0]=true;s=1;
while (s<p*q&&s>0)
{
for(i=t;i<8;i++)
{
ti=ci+dir[i][0];tj=cj+dir[i][1];
if (ti>=0&&ti<p&&tj>=0&&tj<q&&!chess[ti][tj])
{
ci=ti;cj=tj;
chess[ci][cj]=true;
queue[s]=i;t=0;s++;
break;
}
}
if(i==8){
s--;t=queue[s]+1;
chess[ci][cj]=false;
ci-=dir[queue[s]][0],cj-=dir[queue[s]][1];
}
}
printf("Scenario #%d:\n", k);
if (s==p*q)
{
a='A',b='1';printf("%c%c", a, b);
for(i=1;i<p*q;i++)
{
b+=dir[queue[i]][0],a+=dir[queue[i]][1];
printf("%c%c", a, b);
}
printf("\n\n");
}
else printf("impossible\n\n");
}
return 0;
}