Problem: Example

Input

2 4
%.@\$
..\$\$


Output

Yes

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
using namespace std;

int r, c;
int dx[]={0, 0, 1, -1};
int dy[]={1, -1, 0, 0};
char str[205][205];
int dis[205][205];
int chk[205][205];

void bfs(int i, int j){
    int a, b, tx, ty;
    queue< pair<int,int> > qu;
    pair<int, int> p;
    memset(chk, 0, sizeof chk);
    for(a=0; a<r; ++a) for(b=0; b<c; ++b) dis[a][b]=4000005;
    chk[i][j]=1;
    qu.push(make_pair(i, j));
    dis[i][j]=0;
    while(!qu.empty()){
        p=qu.front(); qu.pop();
        for(a=0; a<4; ++a){
            tx=dx[a]+p.first; ty=dy[a]+p.second;
            if(tx>=0 && tx<r && ty>=0 && ty<c && !chk[tx][ty] && str[tx][ty]!='#'){
                chk[tx][ty]=1;
                dis[tx][ty]=dis[p.first][p.second]+1;
                qu.push(make_pair(tx, ty));
            }
        }
    }
}

int main(){
    int i, j, k;
    int m1, m2=4000005;
    scanf("%d %d", &r, &c);
    for(i=0; i<r; ++i) scanf("%s", str[i]);
    for(i=0; i<r; ++i){
        for(j=0; j<c; ++j){
            if(str[i][j]=='\%'){
                bfs(i, j);
                i=r; j=c;
            }
        }
    }
    for(i=0; i<r; ++i){
        for(j=0; j<c; ++j){
            if(str[i][j]=='@') m1=dis[i][j];
            else if(str[i][j]=='$') m2=min(m2, dis[i][j]);
        }
    }

    //cout << m1 << " " << m2 << endl;

    if(m1<m2) printf("Yes\n");
    else printf("No\n");

    return 0;
}