#include #include #include #include #include #include #include #include #include using namespace std; const int inf = 0x7FFFFFFF; const int maxn = 10000; struct node{ int x[21],y[21]; int time; }rt,ne; int n,m,k; int dx[]={0,0,-1,1}; int dy[]={1,-1,0,0}; char f[105][105]; int dis[105][105]; int Is_Ok(node& ne,int u){ ///娉: '&'涓灏 int q=1; for(int i=0;i=n||ne.y[i]>=m||f[ne.x[i]][ne.y[i]]=='O') return 0; if(f[ne.x[i]][ne.y[i]]=='Q') q=2; } return q; } int BFS(){ queueM; rt.time=0; M.push(rt); while(!M.empty()){ rt=M.front(); M.pop(); for(int i=0;i<4;++i){ ne=rt; int q=Is_Ok(ne,i); if(!q) continue; ne.time++; if(q==2) return ne.time; if(dis[ne.x[0]][ne.y[0]]>ne.time){ dis[ne.x[0]][ne.y[0]]=ne.time; M.push(ne); } } } return -1; } int main(){ while(~scanf("%d%d",&n,&m),n+m){ k=0; for(int i=0;i