Почему моя программа выдает ошибку во время выполнения после удаления комментариев в коде ниже? - PullRequest
0 голосов
/ 09 апреля 2019

Есть поле с растениями - сетка из N строк (пронумерованных от 1 до N) и M столбцов (пронумерованных от 1 до M);из его ЯМ-клеток К-клетки содержат растения, а остальные содержат сорняки.За пределами этой сетки везде есть сорняки.Две ячейки являются смежными, если они имеют общую сторону.

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

этоможно перейти из этой клетки в каждую соседнюю клетку, содержащую растение, не пересекая заборов, невозможно перейти из этой клетки в любую клетку, содержащую сорняки, не пересекая заборов

Ввод:

ПервыйСтрока ввода содержит одно целое число T, обозначающее количество тестовых случаев.Описание Т-тестов приведено ниже.Первая строка каждого теста содержит три разделенных пробелом целых числа N, M и K. За ними следуют K строк.Каждая из этих строк содержит два разделенных пробелом целых числа r и c, обозначающих, что ячейка в строке r и столбце c содержит растение.

#include <iostream>
#include<vector>
#include<queue>
using namespace std;

int main() {
    // your code goes here
    int t,n,m,i,j,k,flag=0;
    int r[4] = {-1,1,0,0};
    int c[4] = {0,0,-1,1};
    cin>>t;
    while(t--) {
        int ans=0;
        cin>>n>>m>>k;
      vector < vector<int> >  vec(n, vector<int>(m,0));

      /* for(int z=0; z<k; z++) {
            cin>>i>>j;
            vec[i-1][j-1] = 1;
        } */
        queue<pair<int,int>> q;
        for(i=0;i<n;i++) {
            for(j=0;j<m;j++) {
                if(vec[i][j] == 1) {
                    q.push(make_pair(i,j));
                    flag = 1;
                    break;
                }
            }
            if(flag==1)
            break;
        }
        while(!q.empty()) {
            pair<int,int> p = q.front();
            int a = p.first;
            int b = p.second;
          int x=0;
            q.pop();
            for(i=0;i<4;i++) {
                for(j=0;j<4;j++) {
                    int rr = a + r[i];
                    int cc = b + c[j];
                    if(rr<0 || cc<0 || rr>=n || cc>=m || vec[rr][cc]==0)
                    continue;
                    else {
                        q.push(make_pair(rr,cc));
                        x++;
                    }
                }
            }
            ans = ans + (4-x);
        }
         cout<<ans<<endl;

    }
    return 0;
}

Если я удаляю комментарии выше, это показывает ошибку тайм-аута.Я не могу обнаружить проблему с помощью приведенного выше утверждения.

1 Ответ

1 голос
/ 09 апреля 2019

Давайте предположим, что пользователь установил 1 для обеих пар (6, 7) и (7, 7).

Тогда произойдет следующее:

  • первая обнаруженная пара будет (6, 7)
  • для пары (6, 7), пара (7, 7) будет добавлена ​​в очередь
  • для пары (7, 7), пара (6, 7) будет добавлена ​​снова (но была удалена ранее)
  • для пары (6, 7), пара (7, 7) будет добавлена ​​снова
  • ...

Таким образом, ваш цикл не прекратится никогда, если будет только одна пара соседних пар (и проблема будет с большими группами).

Если вы хотите избежать этого, вы можете установить vec[rr][cc] = 0 после посещения поля; в качестве альтернативы, вы можете установить vec[rr][cc] = -1 (или любое другое значение, отличное от 0 и 1), тогда вы можете различить: 1, не посещенный 0 (но с тем же значением), посещенный 0 (измененный на -1). Вы должны настроить свой чек, хотя:

if(0 <= rr && rr < n && 0 <= cc && cc < m && vec[rr][cc] == 1)
// ...

потому что пропуск на == 0 больше не будет работать (переупорядочивание сравнений не требуется, но теперь оно напоминает более близкое математическое уравнение 0 <= rr <= n, которое, конечно, не может быть записано таким образом в C ++).

...