
Untitled
By: a guest on
Jun 1st, 2012 | syntax:
C++ | size: 2.98 KB | hits: 18 | expires: Never
# include <iostream>
# include <cstdio>
# include <queue>
# include <string>
# include <algorithm>
# define mp make_pair
# define pii pair <int, int>
using namespace std;
//'a'=97 'z'=122 '1'=49(WTF?!)
queue <pii> qw; //очередь коней
queue <int> o; //очередь в который описывается какой конь сейчас идет
int clr[10][10]; // массив который я раскрашиваю
pii k1; //первый конь его цвет=0
pii k2; //второй конь его цвет=1
pii k[8]; //ходы коня
int ans=-1,r[10][10]; //расстояние коня
bool check=false; //если ответ был найден станет тру
void bfs ()
{
while (!qw.empty())
{
pii z=qw.front();
int wtf=o.front(); //вытаскиваю цвет коня который ходит
qw.pop();
o.pop();
for (int i=0;i<8;i++)
{
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) //ну тут проверка не выходит ли конь за ограничения
if (r[z.first+k[i].first][z.second+k[i].second]==-1) //были ли мы тут если небыли :
{
pii t=mp(z.first+k[i].first,z.second+k[i].second); //создаем пару и пихаем в очередь
qw.push(t);
r[t.first][t.second]=r[z.first][z.second]+1; //кол-во шагов коня
clr[t.first][t.second]=wtf; //цвет вершинки
o.push(wtf); //пихаем коняшку который сейчас ходил в очередь
}
else //а вот если мы тут были то
if (wtf!=clr[z.first+k[i].first][z.second+k[i].second]) // если цвета разные то кони //встретились а значит профит :)
{
ans=r[z.first+k[i].first][z.second+k[i].second]; //
check=true;
return;
}
}
}
}
int main ()
{
//freopen ("1.txt","r",stdin);
fill (&clr[0][0],&clr[9][9],-1);
fill (&r[0][0],&r[9][9],-1);
k[0]=mp(-1,-2);
k[1]=mp(-1,2);
k[2]=mp(1,-2);
k[3]=mp(1,2);
k[4]=mp(2,-1);
k[5]=mp(2,1);
k[6]=mp(-2,-1);
k[7]=mp(-2,1);
string pos1,pos2;
cin>>pos1>>pos2;
k1=mp(pos1[0]-96,pos1[1]-48);
k2=mp(pos2[0]-96,pos2[1]-48);
qw.push(k1);
qw.push(k2);
r[k1.first][k1.second]=0;
r[k2.first][k2.second]=0;
o.push(0);
o.push(1);
clr[k1.first][k1.second]=0;
clr[k2.first][k2.second]=1;
bfs();
if (check==false) cout<<"-1";
else cout<<ans<<endl;
return 0;
}