题意是给你一个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!!虽然解不出题目思绪混乱很枯燥烦躁无比,但是希望自己能坚持下去!!!蓝桥杯不能当炮灰!!!