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

  

posted @ 2012-01-18 23:44  快乐.  阅读(151)  评论(0编辑  收藏  举报