您的位置:首页 > 其它

poj 2488 A Knight's Journey(DFS)

2014-03-05 22:02 232 查看
题意是给你一个p*q的棋盘,求骑士可否遍历它,若可以,按字典序输出骑士的路径。

本题分为两部分:

1.DFS。

深搜能搜到最底部,深搜的出口是深度等于棋盘个数。

2.字典序输出。

首先对棋盘编号如下:

所以图中八个点的字典序就为: B3... B5... C2... C6... E2... E6... F3... F5...

转变成变换坐标,为 (x,y) :(-1,-2)... (1,-2)... (-2,-1)... (2,-1)... (-2,1)... (2,1)... (-1,2)... (1,2).....



所以y对应的是字母,为横轴,x对应的是数字,为纵轴。(易错。。。)

代码:

#include<stdio.h>
#include<string.h>

bool flag,vis[26][26];
int p,q,visnum;
char path[60];
int dir[][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};//方向

void dfs(int dep,int x,int y)
{
if(dep==visnum)
{
flag=1;
for(int i=0; i<2*dep; i++)
printf("%c",path[i]);
printf("\n\n");
return;
}
for(int i=0; i<8&&!flag; i++)
{
int nowx=x+dir[i][0];
int nowy=y+dir[i][1];

if(nowx>0&&nowx<=p&&nowy>0&&nowy<=q&&!vis[nowx][nowy])
{
vis[nowx][nowy]=1;

path[2*dep]=nowy+'A'-1;
path[2*dep+1]=nowx+'1'-1;

dfs(dep+1,nowx,nowy);
vis[nowx][nowy]=0;
}
}

}

int main()
{
int n,i;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%d%d",&p,&q);
printf("Scenario #%d:\n",i);

memset(vis,0,sizeof(vis));
visnum=p*q;
vis[1][1]=1;
path[0]='A';
path[1]='1';        //这样的做法比较方便。
flag=0;

dfs(1,1,1);

if(!flag)
printf("impossible\n\n");

}
return 0;
}


come on!!虽然解不出题目思绪混乱很枯燥烦躁无比,但是希望自己能坚持下去!!!蓝桥杯不能当炮灰!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: