Ошибка в тесте - 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()); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д