Ошибка в тесте - C#
Формулировка задачи:
При вводе этого теста:
1 10
1 1 1 1 1 1 1 1 1 1
Выводит:
10
А нужно:
10
R R R R R R R R R
Как исправить? Вот код:
StreamReader r = new StreamReader("input.txt");
StreamWriter w = new StreamWriter("output.txt");
string[] num = r.ReadLine().Split();
int N = int.Parse(num[0]);
int M = int.Parse(num[1]);
int[,] arr = new int[N, M];
for (int i = 0; i < N; i++)
{
string[] line2 = r.ReadLine().Split();
for (int j = 0; j < M; j++)
{
arr[i, j] = int.Parse(line2[j]);
}
}
const int RIGHT = 1, DOWN = 2;
int height = N;
int width = M;
var row = new int[width];
var rowDirs = new List<int>[width];
var column = new int[height];
var columnDirs = new List<int>[height];
row[0] = arr[0, 0];
rowDirs[0] = new List<int>();
for (var x = 1; x < width; x++)
{
row[x] = row[x - 1] + arr[0, x];
rowDirs[x] = new List<int>(rowDirs[x - 1]) { RIGHT };
}
column[0] = arr[0, 0];
columnDirs[0] = new List<int>();
for (var y = 1; y < height; y++)
{
column[y] = column[y - 1] + arr[y, 0];
columnDirs[y] = new List<int>(columnDirs[y - 1]) { DOWN };
}
for (var x = 1; x < width; x++)
{
column[0] = row[x];
for (var y = 1; y < height; y++)
{
if (column[y] <= column[y - 1])
{
column[y] = column[y] + arr[y, x];
columnDirs[y].Add(RIGHT);
}
else
{
column[y] = column[y - 1] + arr[y, x];
if (y == 1)
{
columnDirs[0] = rowDirs[x];
columnDirs[1] = new List<int>(rowDirs[x]);
}
columnDirs[y] = new List<int>(columnDirs[y - 1]) { DOWN };
}
}
}
List<int> resultDir = columnDirs[height - 1];
var path = new char[resultDir.Count];
for (var i = 0; i < path.Length; i++)
{
path[i] = resultDir[i] == RIGHT ? 'R' : 'D';
}
w.WriteLine(column[height - 1]);
w.WriteLine(string.Join(" ", path));
w.Close();
Со всеми остальными тестами работает нормально, но с этим беда.
Решение задачи: «Ошибка в тесте»
textual
Листинг программы
internal class Program
{
static void Main(string[] args)
{
var matrix = InputMatrix();
var minWayMatrix = GetMinWayMatrix(matrix);
var way = GetWay(minWayMatrix);
OutputWay(way, minWayMatrix);
}
private static void OutputWay(string way, int[,] minWayMatrix)
{
int width = minWayMatrix.GetLength(1);
int height = minWayMatrix.GetLength(0);
Console.WriteLine(minWayMatrix[height - 1, width - 1]);
Console.WriteLine(way);
}
private static int[,] InputMatrix()
{
var numbers = Regex.Split(Console.ReadLine(), @"\s+")
.Where(w => !string.IsNullOrEmpty(w))
.Select(int.Parse)
.ToArray();
int height = numbers[0];
int width = numbers[1];
var matrix = new int[height, width];
for (int y = 0; y < height; ++y)
{
numbers = Regex.Split(Console.ReadLine(), @"\s+")
.Where(w => !string.IsNullOrEmpty(w))
.Select(int.Parse)
.ToArray();
for (int x = 0; x < width; ++x)
matrix[y, x] = numbers[x];
}
return matrix;
}
private static int[,] GetMinWayMatrix(int[,] matrix)
{
int width = matrix.GetLength(1);
int height = matrix.GetLength(0);
var result = new int[height, width];
result[0, 0] = matrix[0, 0];
for (int y = 1; y < height; ++y)
result[y, 0] = result[y - 1, 0] + matrix[y, 0];
for (int x = 1; x < width; ++x)
result[0, x] = result[0, x - 1] + matrix[0, x];
for (int y = 1; y < height; ++y)
for (int x = 1; x < width; ++x)
result[y, x] = Math.Min(result[y, x-1], result[y-1, x]) + matrix[y, x];
return result;
}
private static string GetWay(int[,] minWayMatrix)
{
var way = new StringBuilder();
int x = minWayMatrix.GetLength(1) - 1;
int y = minWayMatrix.GetLength(0) - 1;
while (x != 0 && y != 0)
{
int left = minWayMatrix[y, x - 1];
int top = minWayMatrix[y - 1, x];
if (left < top)
{
way.Append("R");
--x;
}
else
{
way.Append("D");
--y;
}
}
way.Append(x == 0 ? new string('D', y) : new string('R', x));
return new string(way.ToString().Reverse().ToArray());
}
}