Chinaunix首页 | 论坛 | 博客
  • 博客访问: 77185
  • 博文数量: 32
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 284
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-26 14:00
个人简介

有梦想的人,正在努力

文章分类

全部博文(32)

文章存档

2015年(32)

我的朋友

分类: C/C++

2015-04-30 20:56:04


        这道题的意思就是在国际象棋的棋盘上,一匹马从一个位置跳到另一个位置最少需要多少步,这里有个常识需要知道,那就是马是可以踏遍棋盘的每一个格子的。所以很自然的用广度搜索。需要注意的是。马在x、y位置上的变化最大为2,所以可以在棋盘周围加上两层不能走的地方,用false标记。
AC代码如下:
(由于我是新手一枚,所以代码很长,而且没用STL,自己写的队列。这道题的Discuss里面有比较短的代码)

  1. #include <iostream>
  2. using namespace std;
  3. const int P = (int)('a' - '1' + '0'); //小写字母和数字的ASCII差值
  4. struct ch{
  5.     bool mark;
  6.     int d;
  7. }ChessBoard[12][12]; //棋盘


  8. struct pos{
  9.     int x;
  10.     int y;
  11. }startPos, destinationPos; //起始点

  12. struct pos QUEUE[64]; //创建队列
  13. void ENQUEUE(int x, int y); //入队
  14. struct pos DEQUEUE(void); //出队
  15. struct pos * head = QUEUE; //队头
  16. struct pos * tail = QUEUE; //队尾

  17. int bfs(void); //BFS

  18. int main()
  19. {
  20.     for(int i = 0; i < 12; ++i)
  21.     {
  22.         ChessBoard[i][0].mark = false;
  23.         ChessBoard[i][1].mark = false;
  24.         ChessBoard[i][10].mark = false;
  25.         ChessBoard[i][11].mark = false;
  26.     }
  27.     for(int i = 0; i < 2; ++i)
  28.     {
  29.         for(int j = 2; j < 10; ++j)
  30.             ChessBoard[i][j].mark = false;
  31.     }
  32.     for(int i = 10; i < 12; ++i)
  33.     {
  34.         for(int j = 2; j < 10; ++j)
  35.             ChessBoard[i][j].mark = false;
  36.     }

  37.     char location1[3];
  38.     char location2[3];
  39.     while(cin >> location1 >> location2)
  40.     {
  41.         for(int i = 2; i < 10; ++i)
  42.         {
  43.             for(int j = 2; j < 10;j++)
  44.             {
  45.                 ChessBoard[i][j].mark = true;
  46.                 ChessBoard[i][j].d = 0;
  47.             }
  48.         }
  49.         head = QUEUE;
  50.         tail = QUEUE;
  51.         startPos.x = (int)(location1[0] - P) + 1;
  52.         startPos.y = (int)(location1[1] - '0') + 1;
  53.         ChessBoard[startPos.x][startPos.y].mark = false;
  54.         destinationPos.x = (int)(location2[0] - P) + 1;
  55.         destinationPos.y = (int)(location2[1] - '0') + 1;
  56.         //cout << startPos.x << " " << startPos.y << endl;
  57.         //cout << destinationPos.x << " " << destinationPos.y << endl;
  58.         int steps = bfs();
  59.         cout << "To get from " << location1 << " to " << location2 << " takes " << steps << " knight moves.\n";
  60.     }
  61.     return 0;
  62. }

  63. int bfs(void)
  64. {
  65.     ENQUEUE(startPos.x, startPos.y);
  66.     struct pos s;
  67.     while(1)
  68.     {
  69.         s = DEQUEUE();
  70.         if(s.x == destinationPos.x && s.y == destinationPos.y)
  71.             return ChessBoard[s.x][s.y].d;
  72.         if(true == ChessBoard[s.x - 2][s.y - 1].mark)
  73.         {
  74.             ChessBoard[s.x - 2][s.y - 1].mark = false;
  75.             ChessBoard[s.x - 2][s.y - 1].d = ChessBoard[s.x][s.y].d + 1;
  76.             ENQUEUE(s.x - 2, s.y - 1);
  77.         }
  78.         if(true == ChessBoard[s.x - 1][s.y - 2].mark)
  79.         {
  80.             ChessBoard[s.x - 1][s.y - 2].mark = false;
  81.             ChessBoard[s.x - 1][s.y - 2].d = ChessBoard[s.x][s.y].d + 1;
  82.             ENQUEUE(s.x - 1, s.y - 2);
  83.         }
  84.         if(true == ChessBoard[s.x + 1][s.y - 2].mark)
  85.         {
  86.             ChessBoard[s.x + 1][s.y - 2].mark = false;
  87.             ChessBoard[s.x + 1][s.y - 2].d = ChessBoard[s.x][s.y].d + 1;
  88.             ENQUEUE(s.x + 1, s.y - 2);
  89.         }
  90.         if(true == ChessBoard[s.x + 2][s.y - 1].mark)
  91.         {
  92.             ChessBoard[s.x + 2][s.y - 1].mark = false;
  93.             ChessBoard[s.x + 2][s.y - 1].d = ChessBoard[s.x][s.y].d + 1;
  94.             ENQUEUE(s.x + 2, s.y - 1);
  95.         }
  96.         if(true == ChessBoard[s.x + 2][s.y + 1].mark)
  97.         {
  98.             ChessBoard[s.x + 2][s.y + 1].mark = false;
  99.             ChessBoard[s.x + 2][s.y + 1].d = ChessBoard[s.x][s.y].d + 1;
  100.             ENQUEUE(s.x + 2, s.y + 1);
  101.         }
  102.         if(true == ChessBoard[s.x + 1][s.y + 2].mark)
  103.         {
  104.             ChessBoard[s.x + 1][s.y + 2].mark = false;
  105.             ChessBoard[s.x + 1][s.y + 2].d = ChessBoard[s.x][s.y].d + 1;
  106.             ENQUEUE(s.x + 1, s.y + 2);
  107.         }
  108.         if(true == ChessBoard[s.x - 1][s.y + 2].mark)
  109.         {
  110.             ChessBoard[s.x - 1][s.y + 2].mark = false;
  111.             ChessBoard[s.x - 1][s.y + 2].d = ChessBoard[s.x][s.y].d + 1;
  112.             ENQUEUE(s.x - 1, s.y + 2);
  113.         }
  114.         if(true == ChessBoard[s.x - 2][s.y + 1].mark)
  115.         {
  116.             ChessBoard[s.x - 2][s.y + 1].mark = false;
  117.             ChessBoard[s.x - 2][s.y + 1].d = ChessBoard[s.x][s.y].d + 1;
  118.             ENQUEUE(s.x - 2, s.y + 1);
  119.         }
  120.     }
  121. }

  122. void ENQUEUE(int x, int y)
  123. {
  124.     tail->x = x;
  125.     tail->y = y;
  126.     ++tail;
  127. }

  128. struct pos DEQUEUE(void)
  129. {
  130.     struct pos s;
  131.     s.x = head->x;
  132.     s.y = head->y;
  133.     ++head;
  134.     return s;
  135. };

阅读(413) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~