zoukankan      html  css  js  c++  java
  • POJ2488A Knight's Journey【骑士游历】

    转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1303350143 

    大致题意:

    给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径

    经典的“骑士游历”问题,DFS水题一道

     

     

    解题思路:

    难度不大,但要注意的地方有3点:

     

    1、  题目要求以"lexicographically"方式输出,也就是字典序...要以字典序输出路径,那么搜索的方向(我的程序是path()函数)就要以特殊的顺序排列了...这样只要每次从dfs(A,1)开始搜索,第一个成功遍历的路径一定是以字典序排列...

    下图是搜索的次序,马的位置为当前位置,序号格为测试下一步的位置的测试先后顺序

    按这个顺序测试,那么第一次成功周游的顺序就是字典序


     

    2、国际象棋的棋盘,行为数字p;列为字母q

    3、网上有同学说 这道题最后一组数据后是有空行的会PE...,我测试过,不会的,能AC

      1 //Memory Time 
    2 //240K 32MS
    3
    4 #include<iostream>
    5 using namespace std;
    6
    7 typedef class
    8 {
    9 public:
    10 int row;
    11 char col;
    12 }location;
    13
    14 int p,q; //chess size = p*q
    15 //数字是行p,字母是列q
    16 bool chess['Z'+1][27];
    17
    18 int x,y; //返回值
    19 void path(int i,int j,int num) //ij为骑士当前在棋盘的位置
    20 { //num为骑士即将要跳到的位置序号
    21 switch(num)
    22 {
    23 case 1: {x=i-1; y=j-2; break;} //注意这个尝试跳的顺序不能错
    24 case 2: {x=i+1; y=j-2; break;} //因为题目要求是字典序lexicographically输出
    25 case 3: {x=i-2; y=j-1; break;} //这个顺序错了,必定WA
    26 case 4: {x=i+2; y=j-1; break;}
    27 case 5: {x=i-2; y=j+1; break;}
    28 case 6: {x=i+2; y=j+1; break;}
    29 case 7: {x=i-1; y=j+2; break;}
    30 case 8: {x=i+1; y=j+2; break;}
    31 }
    32 return;
    33 }
    34
    35 bool DFS(location* way,int i,int j,int step)
    36 {
    37 chess[i][j]=true;
    38 way[step].row=i;
    39 way[step].col=j;
    40 if(step==way[0].row)
    41 return true;
    42
    43 for(int k=1;k<=8;k++) //骑士从当前位置尝试跳到其他位置
    44 {
    45 path(i,j,k);
    46 int ii=x,jj=y;
    47 if(!chess[ii][jj] && ii>=1 && ii<=p && jj>='A' && jj<='A'+q-1)
    48 if(DFS(way,ii,jj,step+1))
    49 return true;
    50 }
    51
    52 chess[i][j]=false; //能执行到这步,说明前面跳的8步都不符合要求
    53 return false; //即当前位置是错误位置,擦除记录返回上一步
    54 }
    55
    56 int main(void)
    57 {
    58 int test;
    59 cin>>test;
    60 int t=1;
    61 while(t<=test)
    62 {
    63 /*Initial*/
    64
    65 memset(chess,false,sizeof(chess));
    66
    67 cin>>p>>q;
    68 if(p==1 && q==1) //范围缩窄,不要也能AC
    69 {
    70 cout<<"Scenario #"<<t++<<':'<<endl;
    71 cout<<"A1"<<endl<<endl;
    72 continue;
    73 }
    74 if(p*q>26 || p>=9 || q>=9 || p<=2 || q<=2) //范围缩窄,不要也能AC
    75 {
    76 cout<<"Scenario #"<<t++<<':'<<endl;
    77 cout<<"impossible"<<endl<<endl;
    78 continue;
    79 }
    80
    81 location* way=new location[p*q+1]; //记录走过的位置坐标
    82 way[0].row=p*q; //记录总步数(棋盘总格子数)
    83
    84 /*DFS*/
    85
    86 bool flag=false;
    87 for(int j='A';j<='A'+q-1;j++)
    88 {
    89 for(int i=1;i<=p;i++)
    90 if(DFS(way,i,j,1))
    91 {
    92 cout<<"Scenario #"<<t++<<':'<<endl;
    93
    94 for(int k=1;k<=way[0].row;k++)
    95 cout<<way[k].col<<way[k].row;
    96 cout<<endl<<endl;
    97 flag=true;
    98 break;
    99 }
    100 if(flag)
    101 break;
    102 }
    103
    104 if(!flag)
    105 {
    106 cout<<"Scenario #"<<t++<<':'<<endl;
    107 cout<<"impossible"<<endl<<endl;
    108 }
    109 }
    110 return 0;
    111 }
  • 相关阅读:
    usaco-3.2-butter-passed
    usaco-3.2-msquare-pass
    usaco-3.2-ratios-pass
    usaco-3.2-spin-pass
    usaco-3.2-kimbits-pass
    usaco-3.2-fact4-pass
    usaco-3.1-stamps-pass
    usaco-3.1-contact-pass
    git操作
    spring 用到的设计模式
  • 原文地址:https://www.cnblogs.com/lyy289065406/p/2122368.html
Copyright © 2011-2022 走看看