.NET 4.x Не работает консольное приложение. Олимпиадная задача - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток всем! Написал консольное приложение для решения олимпиадной задачи по программированию. Программа запускается, но вместо условий задачи и меню - чёрный экран с мигающим курсором. Заранее благодарен за решение или хотя бы подсказку.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;
using System.IO;
 
namespace Beads
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            //int i = 0;
            int j = 0;
            // int beards = 0; Не используется.
            int nowkol = 0;
            int nowkor = 0;
            int maxkol = 0;
            int kor1 = 0;
            int kor2 = 0;
            string c1 = "";
            string c2 = "";
            string userInput = Console.ReadLine();
            int N = Convert.ToInt32(Console.ReadLine());
            string[] a = new string[N];
 
            Console.WriteLine("Задача 'Бусы'");
            Console.WriteLine("Условия задачи: Имеются бусы, состоящие из N бусинок, некотрые из которых красного или голубого цвета, а остальные - белые. Конфигурация бус задается последовательностью цветов бусинок ('b'-голубая,'r'-красная,'w'- белая), начиная с бусинки №1. Порвем бусы и начнем снимать бусинки одного цвета с певого конца, пока не встретится бусинка другого цвета. То же самое проделаем со вторым концом бусинки. Белая бусинка рассматривается как бусинка карасного или голубого цвета по ситуации, то есть может сниматься и с голубыми и красными. Бусы могут не содержать бусинок красного или голубого цвета. Требуется определить точку такого разрыва данных бус, при котором суммарное количество бусинок, собранных с обеих концов максимально. Нужно вывести максимальное количество снятых бус и номера бусинок, между которыми точка разрыва.");
            Console.WriteLine("Нажмите любую кнопку...");
            Console.ReadKey();
            int i = 0;
            do
            {
                Console.Write("Меню:\n1)Открыть файл с комбиацией бус. Нажмите 1\n2) Вручную ввести комбинацию бус и их количество (N). Нажмите 2\n3) Показать решение. Нажмите 3\n4)Закрыть программу. Нажмите 4\n\nВаше решение: ");
                i = int.Parse(Console.ReadLine());
                switch (i)
                {
                    case 1:
                        Console.WriteLine("1");
                        //OpenFileDialog dlg = new OpenFileDialog();
                        //dlg.FileName = "Document";
                        //dlg.DefaultExt = ".txt";
                        //dlg.Filter = "Text documents (.txt)|*.txt";
                        //dlg.ShowDialog();
                        break;
                    case 2:
                        Console.WriteLine("2");
                        userInput = Console.ReadLine();
                        N = Convert.ToInt32(Console.ReadLine());
                        //if (userInput = 'r')
                        //    {
                        //        Console.ForegroundColor = ConsoleColor.Red; // устанавливаем цвет
                        //    }
                        //if else (userInput = 'w')
                        //    {
                        //        Console.ForegroundColor = ConsoleColor.White; // устанавливаем цвет
                        //    }
                        //if else (userInput = 'b')
                        //        {
                        //            Console.ForegroundColor = ConsoleColor.Blue; // устанавливаем цвет
                        //        }
                        break;
                    case 3:
                        Console.WriteLine("Решение.\nМаксимальное количество бус:{int N.ToString()}\nТочки разрыва между бусинками:{kor1.ToString()},{kor2.ToString()}");
                        break;
                    case 4:
                        Console.WriteLine("Вы решили выйти");
                        break;
                    default:
                        Console.WriteLine("Нажимайте только клавиши 1-4...");
                        break;
                }
                Console.Write("\n\n\t\t\tНажмите любую клавишу...");
                Console.ReadLine();
                Console.Clear();
            }
            while (i != 4);
 
            //Перебор разрывов
            for (i = 0; i < userInput.Length; i++)
            {
                nowkol = 0;
                c1 = "";
                c2 = "";
                if (i - 1 == 0)
                {
                    nowkol = userInput.Length;
                }
                else
                {
                    nowkor = i - 1;
                    j = nowkor;
                }
            }
 
            //Идём налево
            while (true)
            {
                if (nowkol == userInput.Length)
                {
                    break;
                }
                if ((a[j] == "w") && (c1 == ""))
                {
                    c1 = a[j];
                }
                if ((a[j] == "w") || (a[j] == c1))
                {
                    nowkol = nowkol++;
                }
                if ((a[j] == "w") && (a[j] == c1))
                {
                    j = j--;
                    if (j == 0)
                    {
                        j = userInput.Length;
                    }
                }
            }
            j = i;
 
            //Идём направо
            while (true)
            {
                if (nowkol == userInput.Length)
                {
                    break;
                }
                if ((a[j] == "w") && (c2 == ""))
                {
                    c2 = a[j];
                }
                if ((a[j] == "w") || (a[j] == c2))
                {
                    nowkol = nowkol++;
                }
                if ((a[j] == "w") && (a[j] == c2))
                {
 
                    j = j++;
                    if (j == userInput.Length + 1)
                    {
                        j = 1;
                    }
                }
            }
            //Запись результата
            if (nowkol > maxkol)
            {
                maxkol = nowkol;
                kor1 = nowkor;
                kor2 = i;
            }
        }
    }
}

Решение задачи: «.NET 4.x Не работает консольное приложение. Олимпиадная задача»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Bead
{
    public class Program
    {
        static void Main(string[] args)
        {
            // Тесты
            // "bbwbrrrwbrbrrrrrb" (10 between 16 and 17)
            // "brbrrrbbbrrrrrbrrbbrbbbbrrrrb" (8 between 9 and 10)
            string pattern = "brbrrrbbbrrrrrbrrbbrbbbbrrrrb";
 
            // Левая часть разрыва
            int leftCursor = 0;
            
            // Правая часть разрыва
            int rightCursor = 1;
 
            // Левая точка разрыва с максимальным числом бусен
            int maxLeftCursor = 0;
 
            // Временная переменная для хранения найденного количества бусин
            int tempCountBeads = 0;
 
            // Правая точка разрыва с максимальным числом бусен
            int maxRightCursor = 1;
 
            // Максимальное число бусен в разрыве
            int maxCountBeads = 0;
 
            bool[] viewedBeads = new bool[pattern.Length];
 
            resetViewedBeads(ref viewedBeads);
 
            if (checkOnDegeneracy(pattern))
            {
                Console.WriteLine("Последовательность бусин имеет вырожденность.");
                Console.ReadKey();
                Environment.Exit(0);
            }
            for (int i = 0; i < pattern.Length - 1; ++i)
            {
                leftCursor = i;
                rightCursor = i + 1;
 
                tempCountBeads = findCountBeads(pattern, ref viewedBeads, 
                                                rightCursor, leftCursor);
 
                changeMaxItems(ref maxCountBeads, ref maxLeftCursor,
                               ref maxRightCursor, tempCountBeads,
                               leftCursor, rightCursor);
            }
            tempCountBeads = findCountBeads(pattern, ref viewedBeads, 
                                            0, pattern.Length - 1);
 
            changeMaxItems(ref maxCountBeads, ref maxLeftCursor,
                               ref maxRightCursor, tempCountBeads,
                               0, pattern.Length - 1);
 
            print(maxCountBeads, maxLeftCursor + 1, maxRightCursor + 1);
        }
 
        static void print(int maxCountBeads, int maxLeftCursor,
                          int maxRightCursor)
        {
            Console.WriteLine("{0} between {1} and {2}", maxCountBeads,
                                    maxLeftCursor, maxRightCursor);
            Console.ReadKey();
        }
 
        static bool changeMaxItems(ref int maxCountBeads,
                                   ref int maxLeftCursor,
                                   ref int maxRightCursor,
                                   int tempCountBeads,
                                   int tempLeftCursor,
                                   int tempRightCursor)
        {
            if (maxCountBeads < tempCountBeads)
            {
                maxCountBeads = tempCountBeads;
                maxLeftCursor = tempLeftCursor;
                maxRightCursor = tempRightCursor;
                return true;
            }
            return false;
        }
 
        static int findCountBeads(string pattern, ref bool[] viewedBeads, 
                              int rightCursor, int leftCursor)
        {
            int countBeads = coumputeLeftSum(pattern, ref viewedBeads, leftCursor) +
                                computeRightSum(pattern, ref viewedBeads, rightCursor);
            resetViewedBeads(ref viewedBeads);
 
            return countBeads;
        }
 
        static int coumputeLeftSum(string pattern, ref bool[] viewedBeads, int leftCursor)
        {
            char color = pattern[leftCursor];
            if (color == 'w')
            {
                color = changeToNextLeftColor(pattern, leftCursor);
            }
            int cursorOffset = leftCursor;
            viewedBeads[leftCursor] = true;
            int count = 1;
 
            for (int i = 1; i < pattern.Length; ++i)
            {
                cursorOffset -= 1;
                if (cursorOffset < 0)
                {
                    cursorOffset = pattern.Length - 1;
                }
                if (pattern[cursorOffset] == color ||
                    pattern[cursorOffset] == 'w')
                {
                    if (!viewedBeads[cursorOffset])
                    {
                        viewedBeads[cursorOffset] = true;
                        ++count;
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
            return count;
        }
 
        static char changeToNextLeftColor(string pattern, int leftCursor)
        {
            int cursorOffset = leftCursor;
            for (int i = 1; i < pattern.Length; ++i)
            {
                cursorOffset -= 1;
                if (leftCursor < 0)
                {
                    cursorOffset = pattern.Length - 1;
                }
                if (pattern[cursorOffset] != 'w')
                {
                    return pattern[cursorOffset];
                }
            }
            return 'w';
        }
 
        static char changeToNextRightColor(string pattern, int rightCursor)
        {
            int cursorOffset = rightCursor;
            for (int i = 1; i < pattern.Length; ++i)
            {
                cursorOffset += 1;
                if (rightCursor > pattern.Length - 1)
                {
                    cursorOffset = 0;
                }
                if (pattern[cursorOffset] != 'w')
                {
                    return pattern[cursorOffset];
                }
            }
            return 'w';
        }
 
        static int computeRightSum(string pattern, ref bool[] viewedBeads, int rightCursor)
        {
            char color = pattern[rightCursor];
            if (color == 'w')
            {
                color = changeToNextRightColor(pattern, rightCursor);
            }
            int cursorOffset = rightCursor;
            viewedBeads[rightCursor] = true;
            int count = 1;
 
            for (int i = 1; i < pattern.Length; ++i)
            {
                cursorOffset += 1;
                if (cursorOffset >= pattern.Length)
                {
                    cursorOffset = 0;
                }
                if (pattern[cursorOffset] == color ||
                    pattern[cursorOffset] == 'w')
                {
                    if (!viewedBeads[cursorOffset])
                    {
                        viewedBeads[cursorOffset] = true;
                        count += 1;
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
            return count;
        }
 
        static void resetViewedBeads(ref bool[] viewedBeads)
        {
            for (int i = 0; i < viewedBeads.Length; ++i)
            {
                viewedBeads[i] = false;
            }
        }
 
        static bool checkOnDegeneracy(string pattern)
        {
            bool noRed = true;
            bool noBlue = true;
 
            for (int i = 0; i < pattern.Length; ++i)
            {
                if (pattern[i] == 'b')
                {
                    noBlue = false;
                }
                if (pattern[i] == 'r')
                {
                    noRed = false;
                }
            }
            return noRed || noBlue;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы