using
System;
using
System.Collections.Generic;
class
Program
{
static
bool
IsValid(
int
r,
int
c,
int
M,
int
N)
{
return
r >= 0 && c >= 0 && r < M && c < N;
}
static
int
MinCost(
char
[][] grid)
{
var
dq =
new
Queue<Tuple<
int
,
int
>>();
int
M = grid.Length, N = grid[0].Length;
var
cost =
new
int
[M][];
for
(
int
i = 0; i < M; i++)
{
cost[i] =
new
int
[N];
for
(
int
j = 0; j < N; j++)
{
cost[i][j] =
int
.MaxValue;
}
}
cost[0][0] = 0;
dq.Enqueue(
new
Tuple<
int
,
int
>(0, 0));
int
[] dr = { 0, 0, -1, 1 };
int
[] dc = { 1, -1, 0, 0 };
while
(dq.Count > 0)
{
var
front = dq.Dequeue();
int
r = front.Item1;
int
c = front.Item2;
for
(
int
i = 0; i < 4; i++)
{
int
new_r = r + dr[i];
int
new_c = c + dc[i];
if
(IsValid(new_r, new_c, M, N))
{
int
new_d = cost[r];
bool
directionChange =
false
;
if
((grid[r] !=
'R'
&& dr[i] == 0 &&
dc[i] == 1) ||
(grid[r] !=
'L'
&& dr[i] == 0 &&
dc[i] == -1) ||
(grid[r] !=
'D'
&& dr[i] == 1 &&
dc[i] == 0) ||
(grid[r] !=
'U'
&& dr[i] == -1 &&
dc[i] == 0))
{
new_d += 1;
directionChange =
true
;
}
if
(cost[new_r][new_c] > new_d)
{
cost[new_r][new_c] = new_d;
if
(directionChange)
{
dq.Enqueue(
new
Tuple<
int
,
int
>(new_r, new_c));
}
else
{
dq.Enqueue(
new
Tuple<
int
,
int
>(new_r, new_c));
}
}
}
}
}
return
cost[M - 1][N - 1];
}
static
void
Main()
{
char
[][] grid = {
new
char
[] {
'R'
,
'R'
,
'R'
,
'R'
},
new
char
[] {
'L'
,
'L'
,
'L'
,
'L'
},
new
char
[] {
'R'
,
'R'
,
'R'
,
'R'
},
new
char
[] {
'L'
,
'L'
,
'L'
,
'L'
}
};
Console.WriteLine(MinCost(grid));
}
}