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;
}

 

posted on 2010-12-14 21:57  ltang  阅读(205)  评论(0编辑  收藏  举报

导航