Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 1st, 2012  |  syntax: C++  |  size: 2.98 KB  |  hits: 18  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
This paste has a previous version, view the difference. Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. # include <iostream>
  2. # include <cstdio>
  3. # include <queue>
  4. # include <string>
  5. # include <algorithm>
  6. # define mp make_pair
  7. # define pii pair <int, int>
  8.  
  9. using namespace std;
  10.            
  11. //'a'=97 'z'=122 '1'=49(WTF?!)
  12. queue <pii> qw;                         //очередь коней
  13. queue <int> o;                         //очередь в который описывается какой конь сейчас идет
  14. int clr[10][10];                      // массив который я раскрашиваю
  15. pii k1;                              //первый конь его цвет=0
  16. pii k2;                             //второй конь его цвет=1
  17. pii k[8];                          //ходы коня
  18. int ans=-1,r[10][10];             //расстояние коня
  19. bool check=false;                //если ответ был найден станет тру
  20.  
  21. void bfs ()
  22. {
  23.     while (!qw.empty())
  24.     {
  25.         pii z=qw.front();
  26.         int wtf=o.front(); //вытаскиваю цвет коня который ходит
  27.         qw.pop();
  28.         o.pop();
  29.         for (int i=0;i<8;i++)
  30.         {
  31.             if (z.first+k[i].first>0 && z.first+k[i].first<9 && z.second+k[i].second>0 && z.second+k[i].second<9) //ну тут проверка не выходит ли конь за ограничения
  32.                 if (r[z.first+k[i].first][z.second+k[i].second]==-1) //были ли мы тут если небыли :
  33.                 {
  34.                     pii t=mp(z.first+k[i].first,z.second+k[i].second); //создаем пару и пихаем  в очередь
  35.                     qw.push(t);
  36.                     r[t.first][t.second]=r[z.first][z.second]+1; //кол-во шагов коня
  37.                     clr[t.first][t.second]=wtf;    //цвет вершинки
  38.                     o.push(wtf);  //пихаем коняшку который сейчас ходил в очередь
  39.                 }
  40.                 else //а вот если мы тут были то
  41.                     if (wtf!=clr[z.first+k[i].first][z.second+k[i].second]) // если цвета разные то кони    //встретились а значит профит :)
  42.                   {
  43.                         ans=r[z.first+k[i].first][z.second+k[i].second]; //
  44.                         check=true;
  45.                         return;
  46.                     }
  47.         }
  48.     }
  49.  
  50. }
  51.  
  52. int main ()
  53. {
  54.     //freopen ("1.txt","r",stdin);
  55.    
  56.     fill (&clr[0][0],&clr[9][9],-1);
  57.     fill (&r[0][0],&r[9][9],-1);
  58.     k[0]=mp(-1,-2);
  59.     k[1]=mp(-1,2);
  60.     k[2]=mp(1,-2);
  61.     k[3]=mp(1,2);
  62.     k[4]=mp(2,-1);
  63.     k[5]=mp(2,1);
  64.     k[6]=mp(-2,-1);
  65.     k[7]=mp(-2,1);
  66.    
  67.     string pos1,pos2;
  68.     cin>>pos1>>pos2;
  69.     k1=mp(pos1[0]-96,pos1[1]-48);
  70.     k2=mp(pos2[0]-96,pos2[1]-48);
  71.  
  72.     qw.push(k1);
  73.     qw.push(k2);
  74.     r[k1.first][k1.second]=0;
  75.     r[k2.first][k2.second]=0;
  76.     o.push(0);
  77.     o.push(1);
  78.     clr[k1.first][k1.second]=0;
  79.     clr[k2.first][k2.second]=1;
  80.  
  81.     bfs();
  82.  
  83.  
  84.     if (check==false) cout<<"-1";
  85.         else    cout<<ans<<endl;
  86.     return 0;
  87. }