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