POJ_2488

 

又是一个骑士问题,果然在广搜中骑士问题是很经典的哈。这个题目比之间做过的骑士的问题实质上就是多了路径的打印,并且最后如果存在路径的话,路径要求是字典序最小的方案。

 

做到字典序最小还是比较容易的,只要在dfs的时候按照从左到右,从上到下的顺序去dfs就可以了。

 

我又一次把棋盘上的运算搞错了,以后一定要引起注意!上下移动对应x的减少与增加,左右移动对应着y的减少与增加!

#include<stdio.h>
#include<string.h>
int vis[30][30],fax[30][30],fay[30][30],p,q,count,n;
int ansx[30],ansy[30],tx,ty,;
int dx[]={-1,1,-2,2,-2,2,-1,1};
int dy[]={-2,-2,-1,-1,1,1,2,2};
int dfs(int x,int y)
{
int i,newx,newy;
if(count==n)
{
tx=x;
ty=y;
return 1;
}
for(i=0;i<8;i++)
{
newx=x+dx[i];
newy=y+dy[i];
if(!vis[newx][newy]&&newx>0&&newx<=p&&newy>0&&newy<=q)
{
count++;
vis[newx][newy]=1;
if(dfs(newx,newy))
{
fax[newx][newy]=x;
fay[newx][newy]=y;
return 1;
}
count--;
vis[newx][newy]=0;
}
}
return 0;
}
int main()
{
int i,j,k,t,tt,x,y,ans;
scanf("%d",&t);
for(tt=1;tt<=t;tt++)
{
printf("Scenario #%d:\n",tt);
scanf("%d%d",&p,&q);
n=p*q;
for(i=1;i<=q;i++)
{
for(j=1;j<=p;j++)
{
memset(vis,0,sizeof(vis));
vis[j][i]=1;
count=1;
fax[j][i]=-1;
fay[j][i]=-1;
if(dfs(j,i))
break;
}
if(count==n)
break;
}
if(count!=n)
{
printf("impossible\n\n");
continue;
}
x=tx;
y=ty;
ans=0;
while(x!=-1)
{
ansx[ans]=x;
ansy[ans]=y;
ans++;
k=x;
x=fax[k][y];
y=fay[k][y];
}
for(i=ans-1;i>=0;i--)
printf("%c%d",ansy[i]-1+'A',ansx[i]);
printf("\n\n");
}
return 0;
}