Problem: Example

Input

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


Output

Yes

Solution (in CPP):

Solution:
#define  _CRT_SECURE_NO_WARNINGS
#pragma comment (linker, "/STACK:526000000")

#include "bits/stdc++.h"

using namespace std;
typedef string::const_iterator State;
#define eps 1e-11L
#define MAX_MOD 1000000007LL
#define GYAKU 500000004LL

#define MOD 998244353LL
#define seg_size 262144*2LL
#define pb push_back
#define mp make_pair
typedef long long ll;
#define REP(a,b) for(long long (a) = 0;(a) < (b);++(a))
#define ALL(x) (x).begin(),(x).end()

unsigned long xor128() {
	static unsigned long x = 123456789, y = 362436069, z = 521288629, w = time(NULL);
	unsigned long t = (x ^ (x << 11));
	x = y; y = z; z = w;
	return (w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)));
}

void init() {
	iostream::sync_with_stdio(false);
	cout << fixed << setprecision(20);
}

#define int ll
int dist[2][300][300];
void solve() {
	int h, w;
	cin >> h >> w;
	vector<string> inputs;
	REP(i, h) {
		string s;
		cin >> s;
		inputs.push_back(s);
	}
	queue<pair<int, int>> next;
	REP(i,h) {
		REP(q, w) {
			if (inputs[i][q] == '@') {
				next.push(mp(i, q));
			}
			else {
				dist[0][i][q] = 1e9;
			}
		}
	}
	while (next.empty() == false) {
		pair<int, int> now = next.front();
		next.pop();
		int dx[4] = { 1,-1,0,0 };
		REP(t, 4) {
			int x = now.first + dx[t];
			int y = now.second + dx[3 - t];
			if (x >= 0 && x < h && y >= 0 && y < w) {
				if (inputs[x][y] == '#') continue;
				if (dist[0][now.first][now.second] + 1< dist[0][x][y]){
					dist[0][x][y] = dist[0][now.first][now.second] + 1;
					next.push(mp(x, y));
				}
			}
		}
	}
	REP(i, h) {
		REP(q, w) {
			if (inputs[i][q] == '$') {
				next.push(mp(i, q));
			}
			else {
				dist[1][i][q] = 1e9;
			}
		}
	}
	while (next.empty() == false) {
		pair<int, int> now = next.front();
		next.pop();
		int dx[4] = { 1,-1,0,0 };
		REP(t, 4) {
			int x = now.first + dx[t];
			int y = now.second + dx[3 - t];
			if (x >= 0 && x < h && y >= 0 && y < w) {
				if (inputs[x][y] == '#') continue;
				if (dist[1][now.first][now.second] + 1 < dist[1][x][y]) {
					dist[1][x][y] = dist[1][now.first][now.second] + 1;
					next.push(mp(x, y));
				}
			}
		}
	}
	REP(i, h) {
		REP(q, w) {
			if (inputs[i][q] == '%') {
				if (dist[0][i][q] < dist[1][i][q]) {
					cout << "Yes" << endl;
					return;
				}
			}
		}
	}
	cout << "No" << endl;
}

#undef int
int main() {
	init();
	solve();
}