#include <stdio.h>
#include <stdlib.h>
//坐标
typedef struct {
int x, y;
}Point;
//队头尾
typedef struct {
Point data[105 * 105];
int front, rear;
}Queue;
//初始化队头尾函数
void initQueue(Queue* q) {
q->front = 0; //头部
q->rear = 0; //尾部
}
//检测是否为空
int isQueueEmpty(Queue* q) {
return q->front == q->rear;
}
//载入队列函数
void enqueue(Queue* q, int x, int y) {
q->data[q->rear].x = x;
q->data[q->rear].y = y;
q->rear++;
}
//载出队列函数
Point dequeue(Queue* q) {
return q->data[q->front++];
}
int main(void) {
int n, m;
scanf("%d%d", &n, &m);
char ch[105][105]; //网格
for (int i = 0; i < n; i++)
scanf("%s", ch[i]);
if (ch[0][0] == '#' || ch[n - 1][m - 1] == '#') {
printf("No\n");
return 0;
}
//初始化队列
Queue q;
initQueue(&q);
//访问并标记
int visited[105][105] = { 0 }; //访问标记的数组
enqueue(&q, 0, 0);
visited[0][0] = 1;
//四向搜索
int dx[4] = { -1, 1, 0, 0 }; //左-1右+1
int dy[4] = { 0, 0, -1, 1 }; //上-1下+1
//BFS搜索
while (!isQueueEmpty(&q)) {
//取出队首的数
Point current = dequeue(&q);
int x = current.x;
int y = current.y;
//能到达出口
if (x == n - 1 && y == m - 1) {
printf("Yes\n");
return 0;
}
//四向寻找
for (int i = 0; i < 4; i++) {
int cx = x + dx[i];
int cy = y + dy[i];
//确保在网格内
if (cx >= 0 && cx < n && cy >= 0 && cy < m) {
//是通路且未被访问
if (ch[cx][cy] == '.' && !visited[cx][cy]) {
visited[cx][cy] = 1;
enqueue(&q, cx, cy);
}
}
}
}
printf("No\n");
return 0;
}