Wieże - Potyczki Algorytmiczne 2011

0

Witam! ;)
Mam problem z tym zadaniem, mimo że wydaje się dość proste.
Daje mi dobry wynik, nie znalazłem testów, jednak dostaję 0/10.
Tablice kolumny i wiersze oznaczają czy w danej kolumnie czy wierszu jest wieża.
Z góry dziękuję za wskazanie błędu!
Treść:
http://main.edu.pl/pl/archive/pa/2011/wie

 #include <stdio.h>
//#include <string.h>
//#include <conio.h>

int main ()
{ int n, i, j;
  scanf("%d",  &n);
  char tablica[n][n];
  int wiersze[n];
  int kolumny[n];
  for (i = 0; i < n; i++)
  { scanf("%s", tablica[i]);
    wiersze[i] = 0;
    kolumny[i] = 0;
  }
  for (i = 0; i < n; i++)
  { for (j = 0; j < n; j++)
    { if (tablica[i][j] == 'W')
      { wiersze[j] = 1;
        kolumny[i] = 1;
      }
    }
  }
  for (i = 0; i < n; i++)
  { if (kolumny[i] == 0)
    { for (j = 0; j < n; j++)
      { if (wiersze[j] == 0)
        { tablica[i][j] = 'W';
          kolumny[i] = 1;
          wiersze[j] = 1;
          break;
        }
      }
    } 
  }
  //printf("\n");
  for (i = 0; i < n; i++)
  { for (j = 0; j < n; j++)
      printf("%c", tablica[i][j]);
    if (i != n - 1)
      printf("\n");
  }
  //getch();
  return 0;  
}
0

przeanalizuj sobie na podstawie tego gdzie masz błąd:

#include <vector>
#include <set>
#include <iostream>

using namespace std;

int main()
{
  ios_base::sync_with_stdio(0);
  int n;
  cin >> n;
  vector<bool> w(n,false),k(n,false);
  set<pair<int,int> > b;
  for (int i=0; i<n; i++)
    {
      string s;
      cin >> s;
      for (int j=0; j<n; j++)
        {
          if (s[j]=='W')
            {
              b.insert(make_pair(i,j));
              w[i] = k[j] = true;
            }
        }
    }
  for (int i=0; i<n; i++)
    {
      for (int j=0; j<n; j++)
        {
          if ((w[i]==k[j] && !w[i]) || b.find(make_pair(i,j))!=b.end())
            {
              cout << 'W';
              w[i]=k[j] = true;
            }
          else
            cout << '.';
        }
      cout << '\n';
    }
  return 0;
}
1

char tablica[n][n];
int wiersze[n];
int kolumny[n];

  1. tak się nie robi (vector albo operator new do tablic o nieokreślonym przy kompilacji rozmiarze)
  2. nawet jakby się tak robiło to nie zostawiasz sobie miejsca na \0 przez co możesz dostać AV lub coś nadpisać w pamięci (sprawdzarki są na to bardziej wrażliwe)

if (i != n - 1)
printf("\n");
czemu w ostatniej linii ma nie byc entera? sprawdzarki czasem sie tego czepiaja

0

Zapomniałem dodać, że jestem newbie ;) Jak działa vector, mimo że nie potrafię z tego korzystać, się domyślam (z opisu biblioteki na wikipedii), natomiast nie do końca wiem co oznacza set, b.find, b.insert oraz make_pair.

Nie zostawiam miejsca na \0? O co chodzi? I dlaczego to jest błąd? Na zajęciach z programowania właśnie tak robiliśmy, no ale chciałbym się tego dobrze nauczyć :)

Tak, ale z tym enterem na końcu też nie działa.

Pozdrawiam!

1

char tekst[100];
jest tablicą składającą się z 100 znaków, ale może pomieścić maksymalnie tekst o długości 99 znaków, dlatego, że ostatni znak o kodzie ascii 0 jest znacznikiem końca tekstu.

0

To dlaczego teraz dostałem 10/10 punktów tylko przy przejściu na C++ i skorzystaniu z biblioteki vector?
Jak powinienem zadeklarować tablicę (macierz) n x n? tablica[n+1][n+1]?
Nieistotne to if (i != n - 1), bo wcześniej tak czy siak nie działało.

#include <cstdio>
#include <vector>
//#include <iostream>
//#include <string.h>
//#include <conio.h>
using namespace std;

int main ()
{ int n, i, j;
  scanf("%d",  &n);
  char tablica[n][n];
  vector <int> wiersze(n, 0), kolumny(n, 0);
  for (i = 0; i < n; i++)
  { scanf("%s", tablica[i]);
    wiersze[i] = 0;
    kolumny[i] = 0;
  }
  for (i = 0; i < n; i++)
  { for (j = 0; j < n; j++)
    { if (tablica[i][j] == 'W')
      { wiersze[j] = 1;
        kolumny[i] = 1;
      }
    }
  }
  for (i = 0; i < n; i++)
  { if (kolumny[i] == 0)
    { for (j = 0; j < n; j++)
      { if (wiersze[j] == 0)
        { tablica[i][j] = 'W';
          kolumny[i] = 1;
          wiersze[j] = 1;
          break;
        }
      }
    } 
  }
  //printf("\n");
  for (i = 0; i < n; i++)
  { for (j = 0; j < n; j++)
      printf("%c", tablica[i][j]);
    //if (i != n - 1)
      printf("\n");
  }
  //getch();
  return 0;  
}
krwq napisał(a):

(vector albo operator new do tablic o nieokreślonym przy kompilacji rozmiarze)

Czyli innymi słowy co napisać? ;) Dlaczego mimo że mam dalej, jak miałem (char tablica[n][n]), dostałem max punktów?

1

dlatego, że wcześniej nadpisywałeś inny fragment pamięci i teraz nadpisujesz widocznie jakiś mniej istotny.

Jak powinienem zadeklarować tablicę (macierz) n x n? tablica[n+1][n+1]?

tak się nie robi tablic dynamicznych, ale jak już koniecznie chcesz to koncepcyjnie powinna mieć takie rozmiary: tablica[n][n+1], czyli n wierszy i n+1 znaków w każdym (n znaków + znak 0 kończący tekst). poucz się odrobinę assemblera, jak już będziesz wiedział co to jest stos, to będziesz wiedział dlaczego tak nie robi się tablic dynamicznych

0

Aaa... więc rozumiem, że błędem kosmetycznym jest teraz to, że pozamieniałem nazewnictwo tablic wierszy z kolumnami.
Na pewno nie chcę koniecznie tak, tylko tak, żeby było wszystko dobrze i żebym wiedział dlaczego :)
Więc jak mógłbyś tylko napisz jak się organizuje taką tablicę Twoją metodą i ew. gdzie jest opis tych funkcji, których użyłeś, żeby rozumieć dobrze nie tylko swój kod, ale też Twój, a już przestanę męczyć ;p

0
b.find(make_pair(i,j))!=b.end()

A to, co to znaczy?

1 użytkowników online, w tym zalogowanych: 0, gości: 1