Language: C++

// BT法

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cmath>
#define N 20
using namespace std;

int h, w, num;

void print(vector<vector <char> > map) {
	for (int i = 0; i < map.size(); i++) {
		for (int j = 0; j < map[i].size(); j++) {
			cout << map[i][j] << flush;
			cout << " " << flush;//if (j != map[i].size()-1) 
		}
		cout << endl;
	}
}

int rec(vector<vector <char> > *map, int callnum, int y, int x, int dy, int dx)// 現在位置と、投げる方向
{
	int res = 0, wy = -1, wx = -1;


	// まず、引数の情報にしたがって投げてみる
	while (true) {
		//map[y][x] = '@';		// デバッグ用にマーク
		y+=dy;
		x+=dx;
		
		// 場外に出た場合は終了
		if (y < 0 || x < 0 || y >= h || x >= w || callnum > 10) {
			return -1;// -1を返す：到達不可の場合
		}
		// ゴール発見
		if (map[y][x] == '3') {
			return callnum+1;
		}
		// 壁があったらそれを消して止まる
		if (map[y][x] == '1') {
			map[y][x] = '0';
			wy = y; wx = x;
			y-=dy;// 止まる位置は壁の前なので調整
			x-=dx;
			break;
		}
	}
	if (map[y][x] == '3') {
		return callnum+1;	// ゴール発見:出力は「投げた回数」なので+1
	}


	// 投げようとする方向が場外ではなく、かつ壁が無ければ投げる
	
	if (y-1 >= 0 && map[y-1][x] != '1') 
		res = rec(map, callnum+1, y, x, -1, 0);
	if (res > 0) {// ゴールを発見したら戻る
		return res;
	}

	res = 0;
	if (y+1 < h && map[y+1][x] != '1')
		res = rec(map, callnum+1, y, x, 1, 0);
	if (res > 0) return res;
	//else return -1;

	res = 0;
	if (x-1 >= 0 && map[y][x-1] != '1')
		res = rec(map, callnum+1, y, x, 0, -1);
	if (res > 0) return res;
	//	else return -1;

	res = 0;
	if (x+1 < w && map[y][x+1] != '1')
		res = rec(map, callnum+1, y, x, 0, 1);
	else {
		if (wy != -1 && wx != -1) map[wy][wx] = '1';
		return -1;
		
	}

	if (res > 0) return res;
	else {
		if (wy != -1 && wx != -1) map[wy][wx] = '1';
		return -1;
	}
}

void out(int res)
{
	if (res <= 10) cout << res << endl;
	else cout <<  -1 << endl;
}
int main()
{
	int n, m, inity, initx, endy, endx;
	
	//vector<vector <bool> > isVisit;
	vector<vector <char> > map;
	
	while (cin >> n >> m) {
		if (n == 0 && m == 0) {
			break;
		}
		// 初期化及びマップの読み込み
		h = m;
		w = n;
		num = initx = inity = endx = endy = 0;
		map.clear();
		map.resize(m);
		for (int i = 0; i < m; i++) map[i].resize(n);

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				cin >> map[j][i];
				if (map[j][i] == '2') {
					inity = j;
					initx = i;
				}
			}
		}

		int res = 0, minres = 0;
		//rec(0, inity, initx, inity, initx);
		if (inity-1 >= 0 && map[inity-1][initx] != '1')
			res = rec(&map, 0, inity, initx, -1, 0);
		else
			res = -1;
		if (minres == 0 && res > 0) minres = res;


		if (inity+1 < h && map[inity+1][initx] != '1')
			res = rec(&map, 0, inity, initx, 1, 0);
		else
			res = -1;
		//output(res);
		if (minres == 0 && res > 0) minres = res;
		else if (res > 0 && res < minres) minres = res;


		if (initx-1 >= 0 && map[inity][initx-1] != '1')
			res = rec(&map, 0, inity, initx, 0, -1);
		else
			res = -1;
		if (minres == 0 && res > 0) minres = res;
		else if (res > 0 && res < minres) minres = res;


		if (initx+1 < w && map[inity][initx+1] != '1')
			res = rec(&map, 0, inity, initx, 0, 1);
		else
			res = -1;
		if (minres == 0 && res > 0) minres = res;
		else if (res > 0 && res < minres) minres = res;


		// 出力する
		if (minres > 0 && minres <= 10) cout << minres << endl;
		else cout << -1 << endl;


		/*if (num < 10) {
			cout << num << endl;
		} else {
			cout << -1 << endl;
		}*/
		//print(map);// 入力はok + 書き換え確認
	}

	return 0;
}

Compiler output:
a.cc: In function 'int rec(std::vector<std::vector<char> >*, int, int, int, int, int)':
a.cc:39:31: error: no match for 'operator==' (operand types are '__gnu_cxx::__alloc_traits<std::allocator<std::vector<char> >, std::vector<char> >::value_type' {aka 'std::vector<char>'} and 'char')
   39 |                 if (map[y][x] == '3') {
In file included from /usr/include/c++/14/iosfwd:42,
                 from /usr/include/c++/14/ios:40,
                 from /usr/include/c++/14/ostream:40,
                 from /usr/include/c++/14/iostream:41,
                 from a.cc:3:
/usr/include/c++/14/bits/postypes.h:192:5: note: candidate: 'template<class _StateT> bool std::operator==(const fpos<_StateT>&, const fpos<_StateT>&)'
  192 |     operator==(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
      |     ^~~~~~~~
/usr/include/c++/14/bits/postypes.h:192:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   '__gnu_cxx::__alloc_traits<std::allocator<std::vector<char> >, std::vector<char> >::value_type' {aka 'std::vector<char>'} is not derived from 'const std::fpos<_StateT>'
   39 |                 if (map[y][x] == '3') {
      |                                  ^~~
In file included from /usr/include/c++/14/string:43,
                 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/allocator.h:235:5: note: candidate: 'template<class _T1, class _T2> bool std::operator==(const allocator<_CharT>&, const allocator<_T2>&)'
  235 |     operator==(const allocator<_T1>&, const allocator<_T2>&)
      |     ^~~~~~~~
/usr/include/c++/14/bits/allocator.h:235:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   '__gnu_cxx::__alloc_traits<std::allocator<std::vector<char> >, std::vector<char> >::value_type' {aka 'std::vector<char>'} is not derived from 'const std::allocator<_CharT>'
   39 |                 if (map[y][x] == '3') {
      |                                  ^~~
In file included from /usr/include/c++/14/string:48:
/usr/include/c++/14/bits/stl_iterator.h:441:5: note: candidate: 'template<class _Iterator> constexpr bool std::operator==(const reverse_iterator<_Iterator>&, const reverse_iterator<_Iterator>&)'
  441 |     operator==(const reverse_iterator<_Iterator>& __x,
      |     ^~~~~~~~
/usr/include/c++/14/bits/stl_iterator.h:441:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   '__gnu_cxx::__alloc_traits<std::allocator<std::vector<char> >, std::vector<char> >::value_type' {aka 'std::vector<char>'} is not derived from 'const std::reverse_iterator<_Iterator>'
   39 |                 if (map[y][x] == '3') {
      |                                  ^~~
/usr/include/c++/14/bits/stl_iterator.h:486:5: note: candidate: 'template<class _IteratorL, class _IteratorR> constexpr bool std::operator==(const reverse_iterator<_Iterator>&, const reverse_iterator<_IteratorR>&)'
  486 |     operator==(const reverse_iterator<_IteratorL>& __x,
      |     ^~~~~~~~
/usr/include/c++/14/bits/stl_iterator.h:486:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   '__gnu_cxx::__alloc_traits<std::allocator<std::vector<char> >, std::vector<char> >::value_type' {aka 'std::vector<char>'} is not derived from 'const std::reverse_iterator<_Iterator>'
   39 |                 if (map[y][x] == '3') {
      |                                  ^~~
/usr/include/c++/14/bits/stl_iterator.h:1667:5: note: candidate: 'template<class _IteratorL, class _IteratorR> constexpr bool std::operator==(const move_iterator<_IteratorL>&, const move_iterator<_IteratorR>&)'
 1667 |     operator==(const move_iterator<_IteratorL>& __x,
      |     ^~~~~~~~
/usr/include/c++/14/bits/stl_iterator.h:1667:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   '__gnu_cxx::__alloc_traits<std::allocator<std::vector<char> >, std::vector<char> >::value_type' {aka 'std::vector<char>'} is not derived from 'const std::move_iterator<_IteratorL>'
   39 |                 if (map[y][x] == '3') {
      |                                  ^~~
/usr/include/c++/14/bits/stl_iterator.h:1737:5: note: candidate: 'template<class _Iterator> constexpr bool std::operator==(const move_iterator<_IteratorL>&, const move_iterator<_IteratorL>&)'
 1737 |     operator==(const move_iterator<_Iterator>& __x,
      |     ^~~~~~~~
/usr/include/c++/14/bits/stl_iterator.h:1737:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   '__gnu_cxx::__alloc_traits<std::allocator<std::vector<char> >, std::vector<char> >::value_type' {aka 'std::vector<char>'} is not derived from 'const std::move_iterator<_IteratorL>'
   39 |                 if (map[y][x] == '3') {
      |                                  ^~~
In file included from /usr/include/c++/14/bits/stl_algobase.h:64,
                 from /usr/include/c++/14/string:51:
/usr/include/c++/14/bits/stl_pair.h:1033:5: note: candidate: 'template<class _T1, class _T2> constexpr bool std::operator==(const pair<_T1, _T2>&, const pair<_T1, _T2>&)'
 1033 |     operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
      |     ^~~~~~~~
/usr/include/c++/14/bits/stl_pair.h:1033:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   '__gnu_cxx::__alloc_traits<std::allocator<std::vector<char> >, std::vector<char> >::value_type' {aka 'std::vector<char>'} is not derived from 'const std::pair<_T1, _T2>'
   39 |                 if (map[y][x] == '3') {
      |                                  ^~~
In file included from /usr/include/c++/14/bits/basic_string.h:47,
                 from /usr/include/c++/14/string:54:
/usr/include/c++/14/string_view:629:5: note: candidate: 'template<class _CharT, class _Traits> constexpr bool std::operator==(basic_string_view<_CharT, _Traits>, __type_identity_t<basic_string_view<_CharT, _Traits> >)'
  629 |     operator==(basic_string_view<_CharT, _Traits> __x,
      |     ^~~~~~~~
/usr/include/c++/14/string_view:629:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   'std::vector<char>' is not derived from 'std::basic_string_view<_CharT, _Traits>'
   39 |                 if (map[y][x] == '3') {
      |                                  ^~~
/usr/include/c++/14/string_view:637:5: note: candidate: 'template<class _CharT, class _Traits> constexpr bool std::operator==(basic_string_view<_CharT, _Traits>, basic_string_view<_CharT, _Traits>)'
  637 |     operator==(basic_string_view<_CharT, _Traits> __x,
      |     ^~~~~~~~
/usr/include/c++/14/string_view:637:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   'std::vector<char>' is not derived from 'std::basic_string_view<_CharT, _Traits>'
   39 |                 if (map[y][x] == '3') {
      |                                  ^~~
/usr/include/c++/14/string_view:644:5: note: candidate: 'template<class _CharT, class _Traits> constexpr bool std::operator==(__type_identity_t<basic_string_view<_CharT, _Traits> >, basic_string_view<_CharT, _Traits>)'
  644 |     operator==(__type_identity_t<basic_string_view<_CharT, _Traits>> __x,
      |     ^~~~~~~~
/usr/include/c++/14/string_view:644:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   mismatched types 'std::basic_string_view<_CharT, _Traits>' and 'char'
   39 |                 if (map[y][x] == '3') {
      |                                  ^~~
/usr/include/c++/14/bits/basic_string.h:3755:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> bool std::operator==(const __cxx11::basic_string<_CharT, _Traits, _Allocator>&, const __cxx11::basic_string<_CharT, _Traits, _Allocator>&)'
 3755 |     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
      |     ^~~~~~~~
/usr/include/c++/14/bits/basic_string.h:3755:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   '__gnu_cxx::__alloc_traits<std::allocator<std::vector<char> >, std::vector<char> >::value_type' {aka 'std::vector<char>'} is not derived from 'const std::__cxx11::basic_string<_CharT, _Traits, _Allocator>'
   39 |                 if (map[y][x] == '3') {
      |                                  ^~~
/usr/include/c++/14/bits/basic_string.h:3772:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> bool std::operator==(const __cxx11::basic_string<_CharT, _Traits, _Allocator>&, const _CharT*)'
 3772 |     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
      |     ^~~~~~~~
/usr/include/c++/14/bits/basic_string.h:3772:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   '__gnu_cxx::__alloc_traits<std::allocator<std::vector<char> >, std::vector<char> >::value_type' {aka 'std::vector<char>'} is not derived from 'const std::__cxx11::basic_string<_CharT, _Traits, _Allocator>'
   39 |                 if (map[y][x] == '3') {
      |                                  ^~~
/usr/include/c++/14/bits/basic_string.h:3819:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> bool std::operator==(const _CharT*, const __cxx11::basic_string<_CharT, _Traits, _Allocator>&)'
 3819 |     operator==(const _CharT* __lhs,
      |     ^~~~~~~~
/usr/include/c++/14/bits/basic_string.h:3819:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   mismatched types 'const _CharT*' and 'std::vector<char>'
   39 |                 if (map[y][x] == '3') {
      |                                  ^~~
In file included from /usr/include/c++/14/bits/memory_resource.h:47,
                 from /usr/include/c++/14/string:68:
/usr/include/c++/14/tuple:2558:5: note: candidate: 'template<class ... _TElements, class ... _UElements> constexpr bool std::operator==(const tuple<_UTypes ...>&, const tuple<_Elements ...>&)'
 2558 |     operator==(const tuple<_TElements...>& __t,
      |     ^~~~~~~~
/usr/include/c++/14/tuple:2558:5: note:   template argument deduction/substitution failed:
a.cc:39:34: note:   '__gnu_cxx::__alloc_traits<std::allocator<std::vector<char> >, std::vector<char> >::value_type' {aka 'std::vector<char>'} is not deri