程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HOJ 1440 Knight Moves -------簡單搜索 BFS 求l兩點之間最小的到達步數

HOJ 1440 Knight Moves -------簡單搜索 BFS 求l兩點之間最小的到達步數

編輯:C++入門知識

[cpp]  //題意:給定兩個點的坐標,按照國際象棋中騎士的走法(有點類似於中國象棋的馬踏斜日,可以向八個方向走),問最短的步子   //思路:典型搜索的題目,一般求最小的步子用BFS   //調試注意:.....   #include<iostream>   #include<queue>   #include<cstring>   #define maxlen 9   using namespace std;   int mat[maxlen][maxlen];   struct node   {      int x;      int y;      int step;   }s,e;   int dir[8][2] = {{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};   int BFS(node s,node e)   {      memset(mat,0,sizeof(mat));//每個點都可以走      queue<node> q;      node ol,ne;      while(!q.empty())      {          q.pop();      }      s.step=0;      q.push(s);      while(!q.empty())      {         ol=q.front();         q.pop();         if(ol.x==e.x&&ol.y==e.y){return ol.step;}         else         {            for(int i=0;i<8;i++)            {               ne.x=ol.x+dir[i][0];               ne.y=ol.y+dir[i][1];               ne.step=ol.step;               if(mat[ne.x][ne.y]||ne.x<1||ne.x>8||ne.y<1||ne.y>8)  continue ;               else               {                  mat[ne.x][ne.y]=1;                  ne.step++;                  q.push(ne);               }            }         }      }      return ne.step;   }   int main()   {      char m,n;      while(cin >> m >>s.y >> n >> e.y)      {          s.x=m-'a'+1;          e.x=n-'a'+1;          cout << "To get from " << m << s.y << " to " << n << e.y << " takes "<<  BFS(s,e) << " knight moves."<<endl;      }      return 0;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved