Блог пользователя rus100

Автор rus100, история, 8 лет назад, По-русски

В свое время хотелось не только играть в компьютерные игры, но их создавать.Чем я и пытался заниматься в свободное время.Сначала были написаны простенькие логические игры на языке C#:крестики-нолики, гомоку, судоку, Дурак, игра 15.Весной этого года я решил написать, что нибудь серьезнее.Поскольку мне нравятся еще и самолеты, я задумался над сюжетом, но ничего более сложного, чем авиационная стрелялка, мне в голову не приходило.Игру решил писать с использованием фреймворка от Microsoft, XNA4.0.Сначала "просмотрел" книгу по программированию игр "Изучаем XNA 4.0", автор Аарон Рид. Потом задумался об оформлении игры, сначала скачал из интернета некоторые текстуры, которые в последствии стали фоном, самолетами,и прочими необходимыми по сюжету вещами.Начал программировать.Сразу понял, что нужно создать для каждого игрового объекта свой класс.Начался сам процесс, который проходил по выходным(суббота и воскресенье) и был спонтанным.Я задумался, что надо как-то выводить на экран необходимые параметры самолета, такие как уровень здоровья, число очков, скорость, уровень топлива.Решил их выводить в верхнем левом экране.Итак начал я создавать игру 24 марта и 24 мая почти доделал.Я посчитал, получилось 16 дней.Так как по образованию не программист, то мог написать не очень хороший код, но игра понравилась двоюродному брату.Вот ссылки на игру и ее исходный код: Игра AirWar

Полный текст и комментарии »

  • Проголосовать: нравится
  • +1
  • Проголосовать: не нравится

Автор rus100, история, 8 лет назад, По-русски

Решал я значит задачу регионального этапа Всероссийской олимпиады по информатике 2013-2014.Задача 1003541 — POBEDA-2014 Написал код на C#.NET 4.0.Проверил ее на тестах данных в условии, ответы идентичные.Отправил решение.Не проходит на 1 тесте. Вот код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.IO;
namespace ConsoleApplication6
{
    class Program
    {  
        static void Main(string[] args)
        {
            string str = File.ReadAllText("pobeda.in");
            UInt64 a1 = 0;
            UInt64 a2 = 0;
            UInt64 a3 = 0;

            UInt64 a4 = 0;     
            UInt64 a12 = 0;
            UInt64 a34 = 0;
            UInt64 kolvo = 0; 
            UInt64 otvet = 0;
            string otv;
            
                string[] str1 = str.Split(' ');
            a1 = UInt64.Parse(str1[0]);
            a2 = UInt64.Parse(str1[1]);
            a3 = UInt64.Parse(str1[2]);
            a4 = UInt64.Parse(str1[3]);
             a12 = Math.Min(a1, a2);
            a34 = Math.Min(a3, a4);
            kolvo =  a12 + a34;
              for (UInt64 j = 0; j < kolvo; j++) {
                if (kolvo < j * j) {
                    otvet = j;
                    break;
                }
              }
            otvet = otvet - 1;
            otv = otvet.ToString();

            
             File.WriteAllText("pobeda.out",otv);
         }
        }
    }

В чем причина?Вроде формат входных данных подходит, поддерживает числа до 2^64,что больше чем 10^18.

Полный текст и комментарии »

  • Проголосовать: нравится
  • -20
  • Проголосовать: не нравится

Автор rus100, история, 8 лет назад, По-русски

Снова попробовал силы на задачах четвертьфинала NEERC.На этот раз я выбрал московский четвертьфинал.Задача Delay Time NEERC 2015/2016 оказалась на редкость простой.Вся соль ее в алгебраических преобразованиях и получении формулы.Весь код занимает несколько строк. Собственно это задача на расчет по формуле.Вот вывод:

h1=(g(t1-d)^2)/2
h2=(g(t2-d)^2)/2

Поделим первое равенство на второе и заметим что g/2 сокращается. Получим:

h1/h2=((t1-d)/(t2-d))^2;
(t1-d)/(t2-d)=(h1/h2)^0,5;
t1-d=(t2-d)*(h1/h2)^0,5;

Переносим что-то влево, а что-то вправо. В итоге

d=(t1-t2*(h1/h2)^0.5)/(1-(h1/h2)^0.5);

Остается написать программу рассчитывающую d по этой формуле.

Полный текст и комментарии »

  • Проголосовать: нравится
  • -20
  • Проголосовать: не нравится

Автор rus100, история, 9 лет назад, По-русски

В субботу проводилось онлайн-соревнование "2015-2016 ACM-ICPC, NEERC, Южный четвертьфинал (онлайн-трансляция, правила ACM-ICPC, предпочтительно команды)".Сегодня воскресенье.Я конечно не спортивный программист, но решил попробовать решить что-нибудь из четвертьфинала.Выбрал задачу с большим количеством решивших.Я не думал, что мне что-то поддастся,все-таки это четвертьфинал чемпионата мира ACM.Перевел условие, посидел, подумал и понял, что она решаемая.Задача I.Я рад, блин. Вот ссылка на мое решение. Результат

Полный текст и комментарии »

  • Проголосовать: нравится
  • -29
  • Проголосовать: не нравится

Автор rus100, история, 9 лет назад, По-русски

Мне раньше нравилось в газетах решать судоку, но не всегда получалось.Несколько раз я пытался написать нечто подобное сначала на VB.NET, потом на C#.Все упиралось в генерацию таблицы, я делал это в лоб и все зависало.Недавно, поискав этот алгоритм в интернете, я нашел следующее:Статья про судоку.И вот я решился и начал кодить. На все у меня ушло 3 дня по 3 часа, а конкретно я сидел в четверг вечером,в пятницу днем и в воскресенье.Вот что получилось: Судоку В нем кнопка сгенерировать генерирует судоку. Щелкнув на пустую клетку, можно в появляющейся форме ввести цифру от 1 до 9.Введенные цифры выделяются красным.В конце, когда все пустые квадратики заполнены цифрами,при правильном решении выводиться сообщение о выигрыше.Вот так я и провел свои выходные.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +16
  • Проголосовать: не нравится

Автор rus100, история, 9 лет назад, По-русски

Попробывал решить задачу B из раунда 311.Решить решил.Проходит на мною придуманных тестах.Вот код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = Console.ReadLine();
            string str2 = Console.ReadLine();
            int n = 0;
            double w = 0;
            string[] strin1 = str1.Split(' ');
            string[] strin2 = str2.Split(' ');
            n = int.Parse(strin1[0]);
            w = double.Parse(strin1[1]);
             double[] cups=new double[2*n];
             for (int i = 0; i <2*n; i++) {
                 cups[i] = double.Parse(strin2[i]);
             }
             double min = cups[0];
             for (int i = 0; i < 2*n; i++)
             {
                 if (cups[i] <= min)
                 {
                     min = cups[i];
                 }
             }
           
             for (int i = 0; i <2*n; i++) {
                 for (int j = i; j <2*n; j++) {
                     if (cups[i] > cups[j]) 
                     { 
                         double c = cups[i];
                     cups[i] = cups[j];
                     cups[j] = c; }
                    
                 }
             }
             double w1 = 0;
                     
                     if (cups[n] > 2 * min)
                     {
                         w1 = min * n * 3;

                     }
                     else {  
                         w1 = cups[n] * n*1.5;}

                     if (w1 > w) {
                         w1 = w;
                     }
             Console.WriteLine(String.Format("{0:0.000000}", w1));
            Console.ReadLine();
        }
    }
}

А теперь глупый вопрос.Почему несмотря на строку String.Format("{0:0.000000}", w1), у меня ответы выводятся с запятой? Прошу извинить за столь глупый вопрос.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +1
  • Проголосовать: не нравится

Автор rus100, история, 9 лет назад, По-русски

Недавно только я решал раунд 311.Как всегда, ориентируясь на свои силы, я попытался решить задачу A.Решение прошло всего 3 теста, на 4 падало.Я не знал почему, не догадывался.После окончания раунда я посмотрел решения других и некоторые тесты, и тест 4 соответственно.Проверив на своем компьютере, я получил исключение "System.OutOfMemoryException", что означает переполнение памяти.Пока решал у меня были сомнения, что будет что-то подобное, поскольку три диапазона чисел, следовательно, дерево с тремя уровнями, и три цикла вложенных друг в друга.При малых n-количество дипломов, такое решение даже проходит, но при больших приводит к зависанию.Вот мой код бестолковый.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            int n=Convert.ToInt32(Console.ReadLine());
            string str1 = Console.ReadLine();
            string str2 = Console.ReadLine();
            string str3 = Console.ReadLine();
            string[] strin1 = str1.Split(' ');
            string[] strin2 = str2.Split(' ');
            string[] strin3 = str3.Split(' ');
            long min1 = long.Parse(strin1[0]);
            long max1 = long.Parse(strin1[1]);
            long min2 = long.Parse(strin2[0]);
            long max2 = long.Parse(strin2[1]);
            long min3 = long.Parse(strin3[0]);
            long max3 = long.Parse(strin3[1]);
           
           
            
                long [, ,] mass=new long[max1-min1+1,max2-min2+1,max3-min3+1];
            for (long i = max1; i >=min1; i--) {
                for (long j = max2; j >= min2; j--) {
                    for (long k = max3; k >=min3; k--) {
                        if (i + j + k == n)
                        {
                            mass[i - min1, j - min2, k - min3] = 1;

                        }
                        else { mass[i - min1, j - min2, k - min3] = 0; }
                    }
                }
             }
            string s="";
            for (long k = max3; k >= min3; k--)
            {    
                for (long j = max2; j >= min2; j--)
                {
                    for (long i = max1; i >= min1; i--)
                    {
                      if (mass[i - min1, j - min2, k - min3] ==1){
                          s=i.ToString()+" "+j.ToString()+" "+k.ToString();
                          break;
                      }    
                    }
                }
            }
            Console.WriteLine(s);
             Console.ReadLine();
        }
    }
}

Полный текст и комментарии »

  • Проголосовать: нравится
  • +4
  • Проголосовать: не нравится

Автор rus100, история, 9 лет назад, По-русски

Решил попробывать свои силы как-то в задачах под буквой C.Выбор пал на 489 С.Смысл задачи в том что дана длина числа и сумма цифр в числе, нужно найти максимальное и минимальное такое число.Решил применить жадный алгоритм.Задачу решил частично, проходила только на 21 тесте.Вот код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = Console.ReadLine();
            int kolvocifr = 0;
            int summacifr = 0;
            string[] strin1 = str1.Split(' ');
            kolvocifr = int.Parse(strin1[0]);
            summacifr = int.Parse(strin1[1]);
            double aver = summacifr / kolvocifr;  
            string str2 = "";
            string str3 = "";    
            int kolvodevjat = 0;
            int ostatok = 0;
            if ((aver > 9)||((summacifr==0)&&(kolvocifr>1)))
            {
                Console.WriteLine("-1" + " " + "-1");
            }
            else {
                if (summacifr >= 9) {
                    kolvodevjat = (summacifr / 9);
                    ostatok = summacifr % 9;
                    for (int i = 0; i < kolvocifr; i++) {
                        if (i < kolvodevjat) { str3 += "9"; }
                        if (i == kolvodevjat) { str3 += ostatok.ToString(); }
                        if (i > kolvodevjat) { str3 += "0"; }
                    }
                }
                else
                {
                    for (int i = 0; i < kolvocifr; i++)
                    {
                        if (i==0) { str3 += summacifr.ToString(); }
                        if (i > 0) { str3 += "0"; }
                    }
                    }
                if (summacifr >9)
                {
                    if (kolvocifr == 2)
                    {


                        str2+= ostatok.ToString();
                        str2 += "9";
                    } 
                    if (kolvocifr > 2) 
                    {kolvodevjat = ((summacifr-1) / 9);
                    ostatok = (summacifr-1) % 9;
                    for (int i = 0; i < kolvocifr; i++)
                    {
                        if (i==0) { str2 += "1"; }
                        if ((i < kolvocifr-kolvodevjat-1)&&(i>0)) { str2 += "0"; }
                        if (i == kolvocifr - kolvodevjat-1) { str2 += ostatok.ToString(); }
                        if (i > kolvocifr - kolvodevjat-1) { str2 += "9"; }
                    } }
                    
                }
                else
                {
                    for (int i = 0; i < kolvocifr; i++)
                    {
                        if (i < kolvocifr-1) {
                            str2 += "1";
                        }
                        if (i == kolvocifr-1) {
                            str2 += (summacifr - kolvocifr+1).ToString();
                        }
                        if (i > kolvocifr - 1) { str2 += "0"; }
                    }
                } }
                Console.WriteLine(str2 + " " + str3);
            Console.ReadLine();
        }                                      
    }
}

Помогите понять где ошибка.Буду благодарен.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +7
  • Проголосовать: не нравится

Автор rus100, история, 9 лет назад, По-русски
 Не сочтите это сообщение за наглость.Пришла мне весной в голову идея написать логическую игру.Я рассудил так: шашки-это больно сложно для меня, шахматы-тем более, решил написать для начала крестики-нолики с полем 3*3.Погуглив информацию в интернете, решил, что использую алгоритм оценочных функций.Вроде бы написал, но играла она слабо.Я нашел следующий выход:прописать первый ход за компьютер прямо в программе в зависимости от того кто первым ходит.Получилось более менее, теперь с компьютером можно сыграть в основном в ничью.
 Я решил не останавливаться на этом и написать что-либо сложнее.Не долго думал я, выбор пал на гомоку, во-первых потому что похожа на крестики-нолики, во-вторых из-за сравнительной легкости в написании программы.Передо мною не стояла задача создать супер-сложный AI, я решил просто попробывать написать что-то такое интересное, а не, например, калькулятор.Снова погуглив, я решил опять писать алгоритм оценочной функции, но тут было все интереснее и сложнее.Основная идея оценочной функции состоит в том, что для любой пустой клетки в 8 направлениях(вверх,вниз,вправо,влево,по диагонали вправо-вверх,вправо-вниз, влево-вверх, влево-вниз) на расстояние 4 клетки от нее считается количество крестиков и ноликов, назначается балл и суммируется баллы.Уделяется внимание группам из 3, 4 подряд идущих крестиков и ноликов, для них назначается повышенный балл, особенно для открытых троек и четверок с обеих сторон.Учитываются и другие ситуации приводящие к построению открытых четверок.
 На этапе написания кода периодически отправлял своему брату exe-шники для тестирования и, попутно послушав о недостатках, усложнял оценочную функцию.Сначала у меня ничего не получалось, AI допускал глупые ошибки, но потом начало что-то выходить.
Прошу не судить меня строго, по специальности являюсь инженером-электриком(проектирую электрические сети).Программирование-просто хобби.Да и особо звезд с неба не хватаю в области спортивного программирования.Кроме того написал пятнашки.    

В итоге получил следующее: Гомоку. А вот и крестики-нолики: Крестики-нолики.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +51
  • Проголосовать: не нравится