Language: C++

#define _USE_MATH_DEFINES
#define INF 0x3f3f3f3f
#include <cstdio>
#include <iostream>
#include <sstream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <limits>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <deque>
#include <bitset>
#include <list>
#include <cctype>
#include <utility>
 
using namespace std;
 
typedef long long ll;
typedef pair <int,int> P;
typedef pair <int,P > PP;
 
int tx[] = {0,1,0,-1};//URDL
int ty[] = {-1,0,1,0};
 
static const double EPS = 1e-8;

class State{
public:
  queue<int> mDir;
  int mMemory;
  int mX;
  int mY;
  State(int dir,int memory,int x,int y) : mMemory(memory),mX(x),mY(y) {
    while(!mDir.empty()){
      mDir.pop();
    }
    mDir.push(dir);
  }

  State(int memory,int x,int y) : mMemory(memory),mX(x),mY(y) {
    while(!mDir.empty()){
      mDir.pop();
    }
  }

  void ClearDir(){
    while(!mDir.empty()){
      mDir.pop();
    }
  }

  void ReadCommand(char command){
    switch(command){
    case '<':// '<' … 実行の向きを左にする．
      ClearDir();
      mDir.push(3);//U:=0,R:=1,D:=2,L:=3
      break;
    case '>':// '>' … 実行の向きを右にする．
      ClearDir();
      mDir.push(1);//U:=0,R:=1,D:=2,L:=3
      break;
    case '^':// '^' … 実行の向きを上にする．
      ClearDir();
      mDir.push(0);//U:=0,R:=1,D:=2,L:=3
      break;
    case 'v':// 'v' … 実行の向きを下にする．
      ClearDir();
      mDir.push(2);//U:=0,R:=1,D:=2,L:=3
      break;
    case '_':// '_' … メモリの値が 0 ならば実行の向きを右に，そうでなければ左にする．
      ClearDir();
      mDir.push(mMemory == 0 ? 1 : 3);//U:=0,R:=1,D:=2,L:=3
      break;
    case '|':// '|' … メモリの値が 0 ならば実行の向きを下に，そうでなければ上にする．
      ClearDir();
      mDir.push(mMemory == 0 ? 2 : 0);//U:=0,R:=1,D:=2,L:=3
      break;
    case '?':// '?' … 実行の向きが上下左右のいずれかにランダムに等確率で変更される
      ClearDir();．
      mDir.push(0);
      mDir.push(1);
      mDir.push(2);
      mDir.push(3);
      break;
    case '.':// '.' … 何もしない．
      break;
    case '@':// '@' … プログラムの実行を停止する．
      break;
    case '0':case '1':case '2':// '0' - '9' … メモリの値を指定の数値にする．
    case '3':case '4':case '5':
    case '6':case '7':case '8':case '9':
      mMemory = command - '0';
      break;
    case '+':// '+' … メモリの値に 1 を加える，ただし値が 15 だった場合 0 にする．
      mMemory = (mMemory == 15 ? 0 : mMemory + 1);
      break;
    case '-':// '-' … メモリの値から 1 を引く，ただし値が 0 だった場合 15 にする．
      mMemory = (mMemory == 0 ? 15 : mMemory - 1);
      break;
    default:
      break;
    }
  }
};

bool isClear(bool visited[21][21][15],int gx,int gy){
  for(int i=0;i<15;i++){
    if(visited[gx][gy][i]) return true;
  }
  return false;
}


int main(){
  int H,W;
  int commands[21][21];

  while(~scanf("%d %d",&H,&W)){
    int gx,gy;
    bool visited[21][21][15];
    memset(visited,0,sizeof(visited));
    for(int y=0;y<H;y++){
      char buf[21];
      scanf("%s",buf);
      for(int x=0;x<W;x++){
	commands[y][x] = buf[x];
	if(buf[x] = '@'){
	  gx = x;
	  gy = y;
	}
      }
    }
    
    queue<State> que;
    
    //dir,memory,x,y
    //U:=0,R:=1,D:=2,L:=3
    que.push(State(1,0,0,0));
    while(!que.empty()){
      State s = que.front();
      que.pop();
      int x = s.mX;
      int y = s.mY;
      char command = commands[y][x];
      s.ReadCommand(command);
      // printf("mem %d x:%d y:%d\n",s.mMemory,x,y);

      while(!s.mDir.empty()){
	int dir = s.mDir.front();
	s.mDir.pop();

	int dx = tx[dir] + x;
	int dy = ty[dir] + y;

	if(dx < 0) dx = W-1;
	if(dx >= W) dx = 0;
	if(dy < 0) dy = H-1;
	if(dy >= H) dy = 0;

	if(visited[dx][dy][s.mMemory]) continue;

	//dir,memory,x,y
	State next(dir,s.mMemory,dx,dy);

	//[x][y][memory]
	visited[dx][dy][s.mMemory] = true;

	que.push(next);
      }
    }
    printf("%s\n",isClear(visited,gx,gy) ? "YES" : "NO");
  }
}

Compiler output:
a.cc: In member function 'void State::ReadCommand(char)':
a.cc:85:18: error: '\U0000ff0e' was not declared in this scope
   85 |       ClearDir();．
      |                  ^~