Language: C++

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<math.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<string>
#include<cmath>
#include<set>
#include<stack>

using namespace std;

char a[60][60];
bool visited[60][60];
int h,w;
int rx,ry,gx,gy;
int ans;
int dir=0;
int dx[4]={0,1,0,-1};
int dy[4]={-1,0,1,0};
string str;

bool go(string s){
    for(int i=0;i<str.length();i++){
        if(str[i]=='['){
            char condition=str[++i];
            bool tr;
            int rev=0;
            if(condition=='~'){
                rev=1;
                condition=str[++i];
            }
            if(condition=='N'){
                if(dir==0){
                    tr=true;
                } else {
                    tr=false;
                }
            } else if(condition=='E'){
                if(dir==1){
                    tr=true;
                } else {
                    tr=false;
                }
            } else if(condition=='S'){
                if(dir==2){
                    tr=true;
                } else {
                    tr=false;
                }
            } else if(condition=='W'){
                if(dir==3){
                    tr=true;
                } else {
                    tr=false;
                }
            } else if(condition=='C'){
                int nx=rx+dx[dir];
                int ny=ry+dy[dir];
                if(nx>=0&&nx<w&&ny>=0&&ny<h&&a[ny][nx]=='#'){
                    tr=true;
                } else {
                    tr=false;
                }
            } else if(condition=='T'){
                tr=true;
            }
            if(rev){
                tr=!tr;
            }
            if(!tr)return 0;
            
            int j,l=0;
            for(j=i+2;j<str.length();j++){
                if(str[j]=='['){
                    l++;
                } else if(str[j]==']'){
                    l--;
                }
                if(l==0){
                    int ret=go(str.substr(i+1,j-i-1));
                    if(ret==1){
                        return 1;
                    } else if(ret==0){
                        return 0;
                    }
                    i=j+1;
                }
            }
        } else if(str[i]=='{'){
            while(1){
                char condition=str[++i];
                bool tr;
                int rev=0;
                if(condition=='~'){
                    rev=1;
                    condition=str[++i];
                }
                if(condition=='N'){
                    if(dir==0){
                        tr=true;
                    } else {
                        tr=false;
                    }
                } else if(condition=='E'){
                    if(dir==1){
                        tr=true;
                    } else {
                        tr=false;
                    }
                } else if(condition=='S'){
                    if(dir==2){
                        tr=true;
                    } else {
                        tr=false;
                    }
                } else if(condition=='W'){
                    if(dir==3){
                        tr=true;
                    } else {
                        tr=false;
                    }
                } else if(condition=='C'){
                    int nx=rx+dx[dir];
                    int ny=ry+dy[dir];
                    if(nx>=0&&nx<w&&ny>=0&&ny<h&&a[ny][nx]=='#'){
                        tr=true;
                    } else {
                        tr=false;
                    }
                } else if(condition=='T'){
                    tr=true;
                }
                if(rev){
                    tr=!tr;
                }
                if(!tr)return 0;
                
                int j,l=0;
                for(j=i+2;j<str.length();j++){
                    if(str[j]=='['){
                        l++;
                    } else if(str[j]==']'){
                        l--;
                    }
                    if(l==0){
                        int ret=go(str.substr(i+1,j-i-1));
                        if(ret==1){
                            return 1;
                        } else if(ret==0){
                            return 0;
                        }
                        i=j+1;
                    }
                }
            }
        } else if(str[i]=='^'){
            ans++;
            int nx=rx+dx[dir];
            int ny=ry+dy[dir];
            if(visited[nx][ny]){
                return -1;
            }
            if(nx>=0&&nx<w&&ny>=0&&ny<h&&a[ny][nx]=='.'){
                rx=nx,ry=ny;
                if(a[ry][rx]=='g'){
                    return 1;
                }
            }
        } else if(str[i]=='v'){
            ans++;
            int nx=rx+dx[dir];
            int ny=ry+dy[dir];
            if(visited[nx][ny]){
                return -1;
            }
            if(nx>=0&&nx<w&&ny>=0&&ny<h&&a[ny][nx]=='.'){
                rx=nx,ry=ny;
                if(a[ry][rx]=='g'){
                    return 1;
                }
            }
        } else if(str[i]=='<'){
            ans++;
            dir=(dir+3)%4;
        } else if(str[i]=='>'){
            ans++;
            dir=(dir+1)%4;
        }
    }
    return 0;
}

int main(){
    ans=0;
    memset(visited,0,sizeof(visited));
    cin>>h>>w;
    for(int i=0;i<h;i++){
        for(int j=0;j<w;j++){
            cin>>a[i][j];
            if(a[i][j]=='s'){
                rx=j,ry=i;
            }
            if(a[i][j]=='g'){
                gx=j,gy=i;
            }
        }
    }
    cin>>str;
    int ret=go(str);
    if(ret==1){
        cout<<ans<<endl;
    } else if(ret==-1){
        cout<<-1<<endl;
    } else {
        cout<<"Seems error"<<endl;
    }
}

Compiler output:
a.cc: In function 'int main()':
a.cc:199:5: error: 'memset' was not declared in this scope
  199 |     memset(visited,0,sizeof(visited));
      |     ^~~~~~
a.cc:13:1: note: 'memset' is defined in header '<cstring>'; this is probably fixable by adding '#include <cstring>'
   12 | #include<stack>
  +++ |+#include <cstring>
   13 |