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

  

posted on 2011-08-22 23:09  Staginner  阅读(349)  评论(0编辑  收藏  举报