Go: package main

import (
	"bufio"
	"os"
	"strings"
	"strconv"
	"fmt"
)

var points [5][5][4]bool

var scanner = bufio.NewScanner(os.Stdin)

func main() {
	for i := 0; i < 9; i++ {
		y := i/2
		if i%2 == 0 {
			scanner.Scan()
			info := strings.Split(scanner.Text(), "")
			for k := range info {
				e, _ := strconv.Atoi(info[k])
				if e != 0 {
					points[y][k][1], points[y][k+1][3] = true, true
				}
			}
		} else {
			scanner.Scan()
			info := strings.Split(scanner.Text(), "")
			for k := range info {
				e, _ := strconv.Atoi(info[k])
				if e != 0 {
					points[y][k][2], points[y+1][k][0] = true, true
				}
			}
		}
	}
	x := 1
	y := 0
	dir := 1
	dx := []int{0, 1, 0, -1}
	dy := []int{-1, 0, 1, 0}
	ds := "URDL"
	fmt.Printf("%s", string(ds[dir]))
	for !(x == 0 && y == 0) {
		if points[y][x][(dir+3)%4] {
			dir = (dir+3)%4
		} else if points[y][x][dir] {

		} else if points[y][x][(dir+1)%4] {
			dir = (dir+1)%4
		} else {
			dir = (dir+2)%4
		}
		x += dx[dir]
		y += dy[dir]
		fmt.Printf("%s", string(ds[dir]))
	}
	fmt.Println()
}

C++: #include <iostream>
#include <algorithm>
 
using namespace std;
 
#define rep(i,n) for(int i=0;i<int(n);i++)
 
void input(bool grid[][9])
{
    rep(i,9){
        string s;
        cin>>s;
        if(i%2==0)
            rep(j,4)
                grid[i][j*2+1]=s[j]-'0';
        else
            rep(j,5)a
                grid[i][j*2]=s[j]-'0';
    }
}
 
enum dir{
    UP,RIGHT,DOWN,LEFT
};
const int di[]={-1,0,1,0};
const int dj[]={0,1,0,-1};
const char output[]="URDL";
 
bool in_range(int i,int j)
{
    return 0<=i && i<9 && 0<=j && j<9;
}
 
int main()
{
    bool grid[9][9]={{0}};
    input(grid);
     
    int i=0,j=0;
    dir prev=RIGHT;
    for(;;){
        dir next[4]={LEFT,UP,RIGHT,DOWN};
        rotate(next,next+prev,next+4);
         
        int k;
        for(k=0;k<3;k++){
            if(in_range(i+di[next[k]],j+dj[next[k]]) && grid[i+di[next[k]]][j+dj[next[k]]])
                break;
        }
         
        cout<<output[next[k]];
         
        i+=di[next[k]]*2;
        j+=dj[next[k]]*2;
        prev=next[k];
         
        if(i==0 && j==0)
            break;
    }
    cout<<endl;
     
    return 0;
}

C++: #include <set>
#include <map>
#include <list>
#include <queue>
#include <stack>
#include <cmath>
#include <ctype.h>
#include <ctime>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <utility>
#include <numeric>
#include <complex>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <cassert>
#include <iostream>
#include <iterator>
#include <algorithm>

using namespace std;

#define REP(i, x, n) for(int i = x; i < n; i++)
#define rep(i, n) REP(i, 0, n)
#define lengthof(x) (sizeof(x) / sizeof(*(x)))
#define FILL(ptr, value) FILL_((ptr), sizeof(ptr)/sizeof(value), (value))
template <typename T>
void FILL_(void * ptr, size_t size, T value){
  std::fill((T*)ptr, (T*)ptr+size, value);
}
//参考http://hadrori.hateblo.jp/entry/aoj0037 
const int dx[] ={-1,0,1,0};
const int dy[] ={0,-1,0,1};
int path[16][16][4];//0:L,1:U,2:R,3:D
int main()
{
  char c;
  for(int i = 0;i <9;i++){
    if(i%2){
      for(int j = 0;j < 5;j++){
	cin >>c;
	if(c =='1'){
	  path[i/2][j][3] = 1;
	  path[i/2+1][j][1] = 1;
	}
      }
    }else{
      for(int j = 0;j < 4;j++){
	cin >>c;
	if(c =='1'){
	  path[i/2][j][2] = 1;
	  path[i/2][j+1][0] = 1;
	}
      }
    }
  }
  int x = 0,y = 0,d = 2;
  /*
(前の方向：右 の場合)
進む方向の優先順位は、上、右、下、左となる。

(前の方向：左 の場合)
進む方向の優先順位は、下、左、上、右となる。

(前の方向：上 の場合)
進む方向の優先順位は、左、上、右、下となる。

(前の方向：下 の場合)
  進む方向の優先順位は、右、下、左、上となる。*/
  string dir ="LURD";
  do{
    for(int i = 0;i < 4;i++){
      int dd =(d+i)%4;
      if(path[y][x][dd]==1){
	path[y][x][dd] -=1;
	x +=dx[dd];
	y +=dy[dd];
	d = dd;
	cout <<dir[dd];
	break;
      }
    }
  }while(x||y);
  cout <<endl;
 
  return 0;
}

C++: #include<iostream>
using namespace std;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
char dc[]={'R','D','L','U'};
bool t[5][5][4];
int flg=0;
void init();
bool ck(int y,int x,int d){
	if(t[y][x][d]==1)return true;
	int ny=y+dy[d];
	int nx=x+dx[d];
	if(t[ny][nx][(d+2)%4]==1)return true;
	return false; 
}
void rec(int y,int x,int d);
int main(){
	init();
	//cout<<"test"<<endl;
	for(int i=0;i<=3;i++){
		for(int j=0;j<=3;j++){
			cin>>t[i][j][0];
		}
		for(int j=0;j<=4;j++){
			cin>>t[i][j][1];
		}
	}
	for(int i=0;i<=3;i++)cin>>t[4][i][0];
	//cout<<"inputend"<<endl;
	rec(0,0,0);
	return 0;
}
void init(){
	for(int i=0;i<5;i++)
		for(int j=0;j<5;j++)
			for(int k=0;k<4;k++)
				t[i][j][k]=0;
}
void rec(int y,int x,int d){
	//cout<<y << " " <<x<<" "<<d<<endl;
	flg++;
	if(y==0&&x==0&&flg>1){
		cout<<endl;
		return;
	}
	
	int d1=(d+1)%4;
	int d2=(d+2)%4;
	int d3=(d+3)%4;
	if(ck(y,x,d3)){
		cout<<dc[d3];
		rec(y+dy[d3],x+dx[d3],d3);
	}else if(ck(y,x,d)){
		cout<<dc[d];
		rec(y+dy[d],x+dx[d],d);
	}else if(ck(y,x,d1)){
		cout<<dc[d1];
		rec(y+dy[d1],x+dx[d1],d1);
	}else{
		cout<<dc[d2];
		rec(y+dy[d2],x+dx[d2],d2);
	}
}

C++: #include <cstdio>
#include <complex>
using namespace std;

int dir = 0;
int cur_x;
int cur_y;
int cur_side;

int refd[] = {0, 1, 0, 1};
int refx[] = {0, 0, -1, 0};
int refy[] = {0, 0, 0, -1};

int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};

char ans[] = "RDLU";

bool WithinRange(int d, int y, int x) {
  if (x < 0) return false;
  if (y < 0) return false;

  if (d == 0) { 
    if (x >= 4) return false;
    if (y >= 5) return false;
  } else {
    if (x >= 5) return false;
    if (y >= 4) return false;
  }
  return true;
}

char walls[2][5][5];

int main() {
  for (int i=0; i<9; i++) {
    int n = i%2 ? 5: 4;
    for (int j=0; j<n; j++) {
      scanf(" %c", &walls[i%2][i/2][j]);
    }
  }

  cur_side = -1;
  while (1) {
    int a, b, c;

    for (int i=0; i<4; i++) {
      int ndir = (dir+3+i)%4;

      a = refd[ndir];
      b = cur_y + refy[ndir];
      c = cur_x + refx[ndir];
      if (WithinRange(a, b, c) && walls[a][b][c] == '1') {
        cur_y += dy[ndir];
        cur_x += dx[ndir];
        printf("%c", ans[ndir]);
        dir = ndir;
        break;
      }
    }

    //printf("(%d, %d)\n", cur_y, cur_x);
    if (cur_y == 0 && cur_x == 0) break;
  }
  puts("");
}