POJ 2488 dfs
原来国际象棋中的骑士是“马”啊 给出一个小于8*8的棋盘,从任意一点开始,以任意一点结束,走遍整个棋盘;
很明显,可也有多种走法,题目要求写出字符串最小的一个 晦涩难懂的题意,光题目读了半天,最后还是问别人题目的意思
关键是输出字符串最小的,都写出来比较输出最小肯定不现实,那就是搜索的时候有处理了,注意根据样例3 横的是ABC 竖的
是123(根据样例确定,mygod这样也可以!!!)然后就可以写出八个方向的顺序
int dir[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},
{1,-2},{1,2},{2,-1},{2,1}};
还有一个问题,记录路径和结束控制,cxl教的 路径用char[]记录,一次纪律两个那就加2呗 结束的控制用step if(step==r*c)就结束
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int dir[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},
{1,-2},{1,2},{2,-1},{2,1}};
int r,c,cas,CASE;
int visit[10][10];
char path[200];
bool b;
void dfs(int rr,int cc,int SUM,int step)
{
path[SUM]='A'+cc-1,path[SUM+1]='1'+rr-1;
if(step==r*c){b=true;return ;}
int k,ro,co;
for(k=0;k<8;k++)
{ ro=rr+dir[k][1], co=cc+dir[k][0];
if(ro<1||ro>r||co<1||co>c)continue;
if(!visit[ro][co])
{
visit[ro][co]=-1;
dfs(ro,co,SUM+2,step+1);
if(b)return ;
visit[ro][co]=0;//!!!这个有回溯的 与poj2492不同 好好考虑一下区别
}
}
return;
}
int main()
{
scanf("%d",&CASE);
for(cas=1;cas<=CASE;cas++)
{
b=false;
scanf("%d%d",&r,&c);
if(c==2||r==2)
{
printf("Scenario #%d:\n",cas);
printf("impossible\n\n");
continue;
}
memset(visit,0,sizeof(visit));
visit[1][1]=-1;
dfs(1,1,0,1);
if(b)
{
path[2*r*c]=0;
printf("Scenario #%d:\n",cas);
cout<<path<<endl<<endl;
}
else
{
printf("Scenario #%d:\n",cas);
printf("impossible\n\n");
}
}
return 0;
}

浙公网安备 33010602011771号