#include #include #include #include using namespace std; typedef vector graph; class allapot { public: int a; int getxx() { return a & 127; } int getyy() { return (a >> 7) & 127; } void setxx(int b) { a=(a & ~127) | b; } void setyy(int b) { a=(a & ~(127 << 7) | (b << 7)); } bool getr() { return ((a >> 14) & 1); } bool getg() { return ((a >> 15) & 1); } bool getb() { return ((a >> 16) & 1); } bool gety() { return ((a >> 17) & 1); } void setr() { a=(a | (1 <<14)); } void setg() { a=(a | (1 <<15)); } void setb() { a=(a | (1 <<16)); } void sety() { a=(a | (1 <<17)); } }; bool szabad(graph& g, allapot a, int x, int y) { if (g[x][y]=='#') return false; if (g[x][y]=='.' || g[x][y]=='X' || g[x][y]=='r' || g[x][y]=='g' || g[x][y]=='b' || g[x][y]=='y') return true; if (g[x][y]=='B' && a.getb()) { return true; } if (g[x][y]=='R' && a.getr()) { return true; } if (g[x][y]=='G' && a.getg()) { return true; } if (g[x][y]=='Y' && a.gety()) { return true; } return false; } vector szom(graph& g, allapot a) { vector r; allapot b; if (a.getxx()>0 && szabad(g, a, a.getxx()-1, a.getyy())) { b=a; b.setxx(a.getxx()-1); r.push_back(b); } if (a.getxx()0 && szabad(g, a, a.getxx(), a.getyy()-1)) { b=a; b.setyy(a.getyy()-1); r.push_back(b); } if (a.getyy() v(270000, false); vector d(270000, -1); deque q; q.push_back(a); d[a.a]=0; v[a.a]=true; while (!q.empty()) { /*while(*/b=q.front(), q.pop_front()/*, v[b.a])*/; vector s=szom(g, b); for (int i=0; i