Language: C++

#include<iostream>
#include<algorithm>
#include<vector>
#include<cassert>
#define F first
#define MAX 1000
#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
{
  int x,y,dir;
  Pox(int x=-1,int y=-1,int 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[MAX][MAX];
int visited[MAX][MAX][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';
    }
}

int main()
{
  int H,W;
  long long L;
  while(cin >> H >> W >> L,H|W|L)
    {
      int dir;
      rep(i,H)
	{
	  string line;
	  cin >> line;
	  rep(j,line.size())
	    {
	      assert(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)
	    {
	      move(H,W,src.F,src.S,dir);
	      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]);
	      L += (phase-visited[src.S][src.F][dir]);
	      for(int i=0;i<L;i++)
		{
		  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;
		      i--;
		      continue;
		    }
		  else if(G[src.S][src.F] == '#')
		    {
		      src.F -= dx[dir];
		      src.S -= dy[dir];
		      dir = (dir+1)%4;
		      i--;
		      continue;
		    }	
		}
	   
	      cout << src.S+1 << " " << src.F+1 << " " << toChar(dir) << endl;
	      
	      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:82:19: error: no matching function for call to 'move(int&, int&, int&, int&, int&)'
   82 |               move(H,W,src.F,src.S,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:36:1: warning: control reaches end of non-void function [-Wreturn-type]
   36 | }
      | ^
a.cc: In function 'char toChar(int)':
a.cc:51:1: warning: control reaches end of non-void function [-Wreturn-type]
   51 | }
      | ^