Language: C++

#include<iostream>
#include<algorithm>
#include<vector>
#include<cassert>
#define F first
#define S second
#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)
using namespace std;
typedef pair<int,int> P;
struct Pox
{
  long long x,y,dir;
  Pox(long long x=-1,long long y=-1,long long dir=-1):x(x),y(y),dir(dir){}
};
int dx[] = {+0,+1,+0,-1};//N,E,S,W
int dy[] = {-1,+0,+1,+0};
char G[101][101];
long long visited[100][100][4];
P src;

int getDir(char c)
{
  switch(c)
    {
    case 'N':
      return 0;
    case 'E':
      return 1;
    case 'S':
      return 2;
    case 'W':
      return 3;
    }
}

char toChar(int c)
{
  switch(c)
    {
    case 0:
      return 'N';
    case 1:
      return 'E';
    case 2:
      return 'S';
    case 3:
      return 'W';
    }
}

void move(int H,int W,int x,int y,int &dir)
{
  //cout << x << "," << y << " " << dir;
  while(true)		
    {      
      x = x - dx[dir];
      y = y - dy[dir];
      //cout << " x = " << x << ", y = " << y << " G = " << G[y][x] << " ";
      if(!(0 <= x && x < W && 0 <= y && y < H))
	{
	  //cout << " X1X";
	  y = y + dy[dir];
	  x = x + dx[dir];
	  dir = (dir-1+4)%4;
	}
      else if(G[y][x] == '#')
	{
	  //cout << " X2X " << "G["<<src.S<<"]["<<src.F<<"]" << " ";
	  y = y + dy[dir];
	  x = x + dx[dir];
	  dir = (dir-1+4)%4;
	}
      else 
	{
	  //cout << " X3X";
	  break;
	}
    }
  //cout << " -> " << x << "," << y << " " << dir << endl;
}
 
int main()
{
  int H,W;
  long long L;
  while(cin >> H >> W >> L,H|W|L)
    {
      /*
      if(W == 1 && H == 1)
	{
	  cout << H << " " << W << " " << L << endl;
	  char c;
	  cin >> c;
	  cout << c << endl;
	  assert(false);
	}
      */
      int dir;
      rep(i,H)
	{
	  string line;
	  cin >> line;
	  rep(j,W)
	    {
	      G[i][j] = line[j];
	      if(!(G[i][j] == '.' || G[i][j] == '#'))src = P(j,i),dir = getDir(G[i][j]),G[i][j] = '.';
	      
	      rep(k,4)visited[i][j][k] = -1;
	    }
	}     

      long long phase = 0;
      vector<Pox> path;
      path.push_back(Pox(src.F,src.S,dir));
      


      while(true)
	{
	  if(phase >= L)
	    {
	      cout << src.S+1 << " " << src.F+1 << " " << toChar(dir) << endl;  
	      break;
	    }
	  if(visited[src.S][src.F][dir] != -1)
	    {   
	      L -= phase;
	      L %= (phase-visited[src.S][src.F][dir]);
	      for(int i=0;i<path.size();i++)
		{
		  if(path[i].x == src.F && path[i].y == src.S)
		    {
		      move(H,W,path[i+L].x,path[i+L].y,path[i+L].dir);
		      cout << path[i+L].y+1 << " " << path[i+L].x+1 << " " << toChar(path[i+L].dir) << endl;  
		      break;
		    }
		}
	      break;
	    }     
 
	  visited[src.S][src.F][dir] = phase;
	  src.F += dx[dir];
	  src.S += dy[dir];
	  if(!(0 <= src.F && src.F < W && 0 <= src.S && src.S < H))
	    {
	      src.F -= dx[dir];
	      src.S -= dy[dir];
	      dir = (dir+1)%4;
	      continue;
	    }
	  else if(G[src.S][src.F] == '#')
	    {
	      src.F -= dx[dir];
	      src.S -= dy[dir];
	      dir = (dir+1)%4;
	      continue;
	    }
 
	  path.push_back(Pox(src.F,src.S,dir));
	  phase++;
	}
      

    }
  return 0;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:134:27: error: no matching function for call to 'move(int&, int&, long long int&, long long int&, long long int&)'
  134 |                       move(H,W,path[i+L].x,path[i+L].y,path[i+L].dir);
      |                       ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a.cc:52:6: note: candidate: 'void move(int, int, int, int, int&)' (near match)
   52 | void move(int H,int W,int x,int y,int &dir)
      |      ^~~~
a.cc:52:6: note:   conversion of argument 5 would be ill-formed:
a.cc:134:66: error: cannot bind non-const lvalue reference of type 'int&' to a value of type 'long long int'
  134 |                       move(H,W,path[i+L].x,path[i+L].y,path[i+L].dir);
In file included from /usr/include/c++/14/bits/exception_ptr.h:41,
                 from /usr/include/c++/14/exception:166,
                 from /usr/include/c++/14/ios:41,
                 from /usr/include/c++/14/ostream:40,
                 from /usr/include/c++/14/iostream:41,
                 from a.cc:1:
/usr/include/c++/14/bits/move.h:137:5: note: candidate: 'template<class _Tp> constexpr typename std::remove_reference<_Tp>::type&& std::move(_Tp&&)'
  137 |     move(_Tp&& __t) noexcept
      |     ^~~~
/usr/include/c++/14/bits/move.h:137:5: note:   candidate expects 1 argument, 5 provided
In file included from /usr/include/c++/14/string:51,
                 from /usr/include/c++/14/bits/locale_classes.h:40,
                 from /usr/include/c++/14/bits/ios_base.h:41,
                 from /usr/include/c++/14/ios:44:
/usr/include/c++/14/bits/stl_algobase.h:675:5: note: candidate: 'template<class _II, class _OI> _OI std::move(_II, _II, _OI)'
  675 |     move(_II __first, _II __last, _OI __result)
      |     ^~~~
/usr/include/c++/14/bits/stl_algobase.h:675:5: note:   candidate expects 3 arguments, 5 provided
In file included from /usr/include/c++/14/algorithm:86,
                 from a.cc:2:
/usr/include/c++/14/pstl/glue_algorithm_defs.h:353:1: note: candidate: 'template<class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2> __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2> std::move(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2)'
  353 | move(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last, _ForwardIterator2 __d_first);
      | ^~~~
/usr/include/c++/14/pstl/glue_algorithm_defs.h:353:1: note:   candidate expects 4 arguments, 5 provided
a.cc: In function 'int getDir(char)':
a.cc:35:1: warning: control reaches end of non-void function [-Wreturn-type]
   35 | }
      | ^
a.cc: In function 'char toChar(int)':
a.cc:50:1: warning: control reaches end of non-void function [-Wreturn-type]
   50 | }
      | ^