Problem: Example

Input

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


Output

Yes

Solution (in CPP):

Solution:
#include<iostream>
using namespace std;
int h,w;
string s[200];
bool used[200][200];
bool nxt[200][200];
bool ns[200][200];
int d[]={0,1,0,-1,0};
int main()
{
	cin>>h>>w;
	for(int i=0;i<h;i++)cin>>s[i];
	for(int i=0;i<h;i++)for(int j=0;j<w;j++)used[i][j]=s[i][j]=='$';
	while(1)
	{
		bool flag=false;
		for(int i=0;i<h;i++)for(int j=0;j<w;j++)ns[i][j]=nxt[i][j]=0;
		for(int i=0;i<h;i++)for(int j=0;j<w;j++)
		{
			if(!used[i][j])continue;
			nxt[i][j]=1;
			for(int r=0;r<4;r++)
			{
				int x=i+d[r],y=j+d[r+1];
				if(x<0||x>=h||y<0||y>=w||s[x][y]=='#')continue;
				nxt[x][y]=1;
			}
		}
		for(int i=0;i<h;i++)for(int j=0;j<w;j++)used[i][j]=nxt[i][j];
		for(int i=0;i<h;i++)for(int j=0;j<w;j++)
		{
			if(s[i][j]!='@')continue;
			for(int r=0;r<4;r++)
			{
				int x=i+d[r],y=j+d[r+1];
				if(x<0||x>=h||y<0||y>=w||s[x][y]=='#'||used[x][y])continue;
				if(s[x][y]=='%')
				{
					cout<<"Yes"<<endl;
					return 0;
				}
				ns[x][y]=1;
				flag=true;
			}
			if(!used[i][j])ns[i][j]=1,flag=true;
			s[i][j]='.';
		}
		if(!flag)
		{
			cout<<"No"<<endl;
			return 0;
		}
		for(int i=0;i<h;i++)
		{
			for(int j=0;j<w;j++)if(ns[i][j])s[i][j]='@';
		}
	}
}