Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
#1

Программа не проходит тест на ******** - C++

18.04.2012, 01:44. Просмотров 1173. Ответов 2
Метки нет (Все метки)

http://********/index.asp?main=task&id_task=446
Табло(спойлер)
На хоккейном стадионе в одном большом городе расположено большое прямоугольное табло. Оно имеет n строк и m столбцов (то есть состоит из n x m ячеек). Во время хоккейного матча это табло служит для отображения счета и времени, прошедшего с начала тайма, а в перерывах на нем показывают различную рекламу.

В связи с этим возникла задача проверки возможности показа на этом табло определенной рекламной заставки. Заставка также, как и табло, имеет размер n строк на m столбцов. Каждая из ячеек заставки окрашена в один из четырех цветов - трех основных: красный - R, зеленый - G, синий - B и черный - .(точка).

Каждая из ячеек табло характеризуется своими цветопередаточными возможностями. Любая из ячеек табло может отображать черный цвет - это соответствует тому, что на нее вообще не подается напряжение. Также каждая из ячеек может отображать некоторое подмножество множества основных цветов. В этой задаче эти подмножества будут кодироваться следующим образом:

0 - ячейка может отображать только черный цвет;
1 - ячейка может отображать только черный и синий цвета;
2 - ячейка может отображать только черный и зеленый цвета;
3 - ячейка может отображать только черный, зеленый и синий цвета;
4 - ячейка может отображать только черный и красный цвета;
5 - ячейка может отображать только черный, красный и синий цвета;
6 - ячейка может отображать только черный, красный и зеленый цвета;
7 - ячейка может отображать только черный, красный, зеленый и синий цвета.

Напишите программу, которая по описанию табло и заставки определяет: возможно ли на табло отобразить эту заставку.
Входные данные

Первая строка входного файла INPUT.TXT содержит целые числа n и m (1 <= n, m <= 100). Далее идут n строк по m символов каждая - описание заставки. Каждый из символов описания заставки принадлежит множеству {R, G, B, .} . Их значения описаны выше.

После этого идет описание табло. Оно содержит n строк по m чисел, разделенных пробелами. Значения чисел описаны выше.
Выходные данные

В выходной файл OUTPUT.TXT выведите YES, если на табло возможно отобразить заставку и NO - в противном случае.

Мой вариант решения
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <fstream>
#include <string>
 
 
int main()
{
  char **tablo = NULL;
  int temp = 0;
  bool superBreak = false; // супер пупер выход из всех циклов
  size_t rows = 0;
  size_t columns = 0;
  std::ifstream fin("input.txt");
  std::ofstream fout("output.txt");
 
  fin >> rows >> columns; // получение размеров массива
  tablo = new char*[ rows ]; // создание динамического массива
  for ( size_t i = 0; i < rows; ++i )
  {
     tablo[i] = new char[ columns ];
  }
 
  fin.get(); // перейти на новую строку
  std::string curLine; // для хранения текущей строки
  for ( size_t i = 0; i < rows; ++i ) // инициализация табла
  {
      std::getline( fin, curLine );
      for ( size_t j = 0; j < columns; ++j )
      {
         tablo[i][j] = curLine[j];
      }
  }
/* если это раскоментировать, то будет произведен вывод только отладочной информации и выход */
//  for ( size_t i = 0; i < rows; ++i )
//  {
//      for ( size_t j = 0; j < columns; ++j )
//      {
//         fout << tablo[i][j];
//      }
//      fout << std::endl;
//  }
//  return 0;
 
  for ( size_t i = 0; i < rows && !superBreak; ++i )
  {
      for ( size_t j = 0; j < columns && !superBreak; ++j )
      {
         fin >> temp;
         switch( tablo[i][j] )
         {
            case '.':
               break;
            case 'R':
               if ( temp < 4 )
               {
                  superBreak = true;
               }
               break;
            case 'G':
               if ( !( temp == 2 || temp == 3 || temp == 6 || temp == 7 ) )
               {
                  superBreak = true;
               }
               break;
            case 'B':
               if ( temp % 2 == 0 )
               {
                  superBreak = true;
               }
               break;
            default:
//               throw (-1); // ловушка для ошибок, когда именно в этой строчке
                             // случается RuntimeError, то массив инициализирован некорректно
               break;
         }
      }
  }
 
  if ( !superBreak ) // если не произведен досрочный выход из цикла, то там всё ок
     fout << "YES";
  else               // иначе какой-то пиксель не способен отобразить заданный цвет
     fout << "NO";
 
  fout.close();
  fin.close();
 
  return 0;
}

Как вы считаете, нет ли здесь какой-нибудь ошибки?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2012, 01:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа не проходит тест на ******** (C++):

Сбор черники. Программа не проходит 11 тест - C++
Текст задачиСбор черники (Время: 1 сек. Память: 16 Мб Сложность: 17%) В фермерском хозяйстве в Карелии выращивают чернику. Она...

Программа на контестере проходит только 1 тест из 9. Можете объяснить, в чем моя ошибка и как ее исправить! - C++
Объясните, в чем моя ошибка в решении задачи. Условие: 103. Подсчет войск ограничение времени на тест: 0.5 сек. ...

Антагонистические игры двух лиц, програмама не проходит 3 тест - C++
Задача: Теория игр (Время: 1 сек. Память: 16 Мб Сложность: 28%) Одним из интересных объектов, изучаемых в теории игр, являются так...

Компиляция проходит, но программа работает неправильно - C++
Задача: дан текстовый файл. в нем символы &quot;.&quot; и &quot;,&quot; заменить на &quot;тчк&quot; и &quot;зпт&quot; соответственно. ...

Программа не проходит тесты по времени, посоветуйте как исправить - C++
Добрый день, не могли бы вы подсказать по задаче. Имеется круг с целыми числами от 1 до n. Числа можно или занимать или освобождать если...

Программа-тест - C++
Напишите универсальную функцию для нахождения среднего геометрического отрицательных элементов матриц с произвольным числом строк и...

2
valeriikozlov
Эксперт С++
4673 / 2499 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
18.04.2012, 04:17 #2
Цитата Сообщение от Buckstabue Посмотреть сообщение
Как вы считаете, нет ли здесь какой-нибудь ошибки?
если не проходит какой-нибудь тест, то ошибка точно есть. Вот так проходит все тесты:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <fstream>
#include <string>
 
 
int main()
{
  char **tablo = NULL;
  int temp = 0;
  bool superBreak = false; // супер пупер выход из всех циклов
  size_t rows = 0;
  size_t columns = 0;
  std::ifstream fin("input.txt");
  std::ofstream fout("output.txt");
 
  fin >> rows >> columns; // получение размеров массива
  tablo = new char*[ rows ]; // создание динамического массива
  for ( size_t i = 0; i < rows; ++i )
  {
     tablo[i] = new char[ columns ];
  } 
  
  std::string curLine; // для хранения текущей строки
  std::getline(fin, curLine ); // перейти на новую строку
  for (size_t  i = 0; i < rows; ++i ) // инициализация табла
  {
      std::getline( fin, curLine );
      for (size_t j = 0; j < columns; ++j )
      {
         tablo[i][j] = curLine[j];
      }
  }
/* если это раскоментировать, то будет произведен вывод только отладочной информации и выход */
/*  for (size_t  i = 0; i < rows; ++i )
  {
      for ( size_t j = 0; j < columns; ++j )
      {
         fout << tablo[i][j];
      }
      fout << std::endl;
  }
  return 0;*/
 
  for (size_t i = 0; i < rows && !superBreak; ++i )
  {
      for ( size_t j = 0; j < columns && !superBreak; ++j )
      {
         fin >> temp;
         switch( tablo[i][j] )
         {
            case '.':
               break;
            case 'R':
               if ( temp < 4 )
               {
                  superBreak = true;
               }
               break;
            case 'G':
               if ( !( temp == 2 || temp == 3 || temp == 6 || temp == 7 ) )
               {
                  superBreak = true;
               }
               break;
            case 'B':
               if ( temp % 2 == 0 )
               {
                  superBreak = true;
               }
               break;
            default:
//               throw (-1); // ловушка для ошибок, когда именно в этой строчке
                             // случается RuntimeError, то массив инициализирован некорректно
               break;
         }
      }
  }
 
  if ( !superBreak ) // если не произведен досрочный выход из цикла, то там всё ок
     fout << "YES";
  else               // иначе какой-то пиксель не способен отобразить заданный цвет
     fout << "NO";
 
  fout.close();
  fin.close();
 
  return 0;
}
1
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
18.04.2012, 08:17  [ТС] #3
valeriikozlov, огромное спасибо, я уж думал каждую строчку при помощи std::iostringstream считывать, чтоб наверняка всё было как надо, по-человечески. Странно, что лично у меня без вот этого cin.get() программа считывала перевод на новую строку и записывала в табло в качестве первого пикселя. Тут уж либо компиляторы больно разные, либо формат файла несколько разнится
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2012, 08:17
Привет! Вот еще темы с ответами:

Программа тест. - C++
здравствуйте!) у меня есть программа тест и в ней нужно как то задать время на прохождение этого теста через конфигурационный файл ...

Программа тест с командами - C++
Помогите, пожалуйста добавить возможность, в конце теста, начать тест с начала. Например чтобы выводился на экран вопрос:&quot;Если хотите...

Программа-тест на темперамент - C++
Здравствуйте! C++ начал учить недавно, но уже появилась небольшая задача, которую хотел бы решить с помощью программирования. Задача...

Программа тест для проверки знаний, может есть у кого? - C++
Доброго времени суток! Может кто-нибудь поделиться программой для тестирования, в которой будут вопросы и несколько вариантов ответов.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru