#include<iostream>
using namespace std;

int max_x, max_y;      //地圖的邊界
char maze[105][105]; 
bool visited[105][105] //紀錄地圖的格子是否有被拜訪過,1代表拜訪過,0則是未拜訪
bool ans;              //是否有找到餅乾

void run( int y, int x )
{
    //如果 '超出上下左右的邊界' 或 '已經找到餅乾了' 就return
    if( x < 0 || x >= max_x || y < 0 || y >= max_y || ans == 1 )
        return;

    //如果 '已經拜訪過這格' 或 '這一格是障礙物' 就return
    if( visited[y][x] == 1 || maze[y][x] == 'x' )
        return;

    //拜訪了此格,visited[y][x]=1代表拜訪過,0則是未拜訪過
    visited[y][x] = 1;

    //如果這一格剛好是餅乾,則記錄找到餅乾
    if( maze[y][x] == 'O' )
        ans = 1;

    run( y-1, x ); //往上方探索 ↑
    run( y+1, x ); //往下方探索 ↓
    run( y, x-1 ); //往左方探索 ←
    run( y, x+1 ); //往右方探索 →

}

int main()
{
   int i, j, start_x, start_y;
   while( cin >> max_x >> max_y )
   {
      for( i = 0 ; i < max_y ; i++ )
        for( j = 0 ; j < max_x ; j++ )
        {
           cin >> map[i][j]; //輸入此格地圖資訊,可能是 M , O , . , x 
           visited[i][j] = 0; //初始化,讓每一個格子都是未拜訪過的
           if( maze[i][j] == 'M' ) //如果輸入的 M 小鼠
           {
              //紀錄座標,方便等等從小鼠的位置開始搜尋
              start_y = i;
              start_x = j;
           }
        }

      ans = 0;
      run( start_y, start_x ); //從小鼠的位置開始進行DFS搜尋

      if( ans ) //ans = 1 代表有找到餅乾
        cout << "Yes!" << endl;
      else
        cout << "Oh, no!" << endl;
   }
   return 0;
}

results matching ""

    No results matching ""