Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
18.04.2012, 01:44     Программа не проходит тест на ******** #1
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;
}

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

C++ Программа тест.
Компиляция проходит, но программа работает неправильно C++
Программа на контестере проходит только 1 тест из 9. Можете объяснить, в чем моя ошибка и как ее исправить! C++
Программа-тест на темперамент C++
Программа не проходит тесты по времени, посоветуйте как исправить C++
C++ Программа "Тест по истории"
Программа-тест C++
C++ Программа тест для проверки знаний, может есть у кого?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 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;
}
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
18.04.2012, 08:17  [ТС]     Программа не проходит тест на ******** #3
valeriikozlov, огромное спасибо, я уж думал каждую строчку при помощи std::iostringstream считывать, чтоб наверняка всё было как надо, по-человечески. Странно, что лично у меня без вот этого cin.get() программа считывала перевод на новую строку и записывала в табло в качестве первого пикселя. Тут уж либо компиляторы больно разные, либо формат файла несколько разнится
Yandex
Объявления
18.04.2012, 08:17     Программа не проходит тест на ********
Ответ Создать тему
Опции темы

Текущее время: 21:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru