zoukankan      html  css  js  c++  java
  • 骑士的移动

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/E

    题意:

          输入标准8*8国际象棋棋盘上的两个格子(列用a~h表示,行用1~8表示),求马最少需要多少步从起点跳到终点。(可输入多组案例)

         input:

         e2 e4

         a1 b2

         b2 c3

         f6 f6

         output:

         To get from e2 to e4 takes 2 knight moves.

         To get from a1 to b2 takes 4 knight moves.

         To get from b2 to c3 takes 2 knight moves.

         To get from f6 to f6 takes 0 knight moves.

    思路分析:

                 求的是最短路,可以用BFS。

                 要先把马会走的8个方向记为一个坐标变化的二维数组,a~h转化为1~8,设立一个二维数组记录马所到过的坐标。

                 注意:马不能离开棋盘,马不能再次到达它所到过的地方。

                 再利用BFS求最短路。

    源代码如下:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<queue>
     5 using namespace std;
     6 int s[8][2]={{2,-1},{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2}};     //八个方向
     7 int ch[10][10];
     8 struct node
     9 {
    10     int x,y,count;
    11 }a,b;
    12 int main()
    13 {
    14     
    15     char c1,c2;
    16     int r1,r2,c3,c4;
    17     while(cin>>c1>>r1>>c2>>r2)
    18     {
    19         c3=c1-'a'+1;                 
    20         c4=c2-'a'+1;
    21         memset(ch, 0, sizeof(ch));    //地图清零,以便记录马是否到过
    22         ch[c3][r1]=1;
    23         b.x=c3;b.y=r1;b.count=0;
    24         queue<node> d;
    25         d.push(b);
    26         while(!d.empty())           //BFS
    27         {
    28             a=d.front();
    29             d.pop();
    30             if(a.x==c4&&a.y==r2)break;
    31             for(int i=0;i<8;i++)
    32             {
    33                 b.x=a.x+s[i][0];
    34                 b.y=a.y+s[i][1];
    35                 if(b.x<1||b.x>8||b.y<1||b.y>8)continue;
    36                 if(ch[b.x][b.y]==1)continue;
    37                 ch[b.x][b.y]=1;
    38                 b.count=a.count+1;
    39                 d.push(b);
    40             }
    41         }
    42         printf("To get from %c%d to %c%d takes %d knight moves.
    ",c1,r1,c2,r2,a.count);
    43     }
    44     return 0;
    45 }
  • 相关阅读:
    特征可视化技术(CAM)
    特征可视化技术(CAM)
    attention
    attention
    Aggregated Residual Transformations for Deep Neural Networks(ResNeXt)
    attention
    attention
    位姿估计
    attention
    通过几个例子看下seajs模块标识符(有图有真相)
  • 原文地址:https://www.cnblogs.com/q-c-y/p/4675226.html
Copyright © 2011-2022 走看看