#include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f using namespace std; struct point { int x,y,z; }; point b; mapgg; int n,m; char mp[105][105]; int vis[105][105][16]; int dir[4][2]={ {1,0},{-1,0},{0,-1},{0,1} }; void init() { gg['b']=gg['B']=0; gg['y']=gg['Y']=1; gg['r']=gg['R']=2; gg['g']=gg['G']=3; } int bfs() { queuess; ss.push(b); vis[b.x][b.y][b.z]=0; while(ss.size()) { point f=ss.front(); ss.pop(); for(int i=0;i<4;i++) { b.x=f.x+dir[i][0]; b.y=f.y+dir[i][1]; b.z=f.z; if(mp[b.x][b.y]!='#'&&vis[b.x][b.y][b.z]==-1) { if(mp[b.x][b.y]=='X') return vis[f.x][f.y][f.z]+1; if(mp[b.x][b.y]=='.') { vis[b.x][b.y][b.z]=vis[f.x][f.y][f.z]+1; ss.push(b); continue; } int t=gg[mp[b.x][b.y]]; if(isupper(mp[b.x][b.y])) { if(b.z>>t&1) { vis[b.x][b.y][b.z]=vis[f.x][f.y][f.z]+1; ss.push(b); } } else { b.z=b.z|1<