Informatică, întrebare adresată de Tudorica69, 9 ani în urmă

mgo


Timp maxim de executie/test:
0.1 secunde
Memorie totala disponibila/stiva:
16 MB/1 MB
Ana si Bogdan joaca mgo (mini-go). Mgo se joaca pe o tabla constituita dintr-o succesiune de casute (numerotate de la 1 la P de la stanga la dreapta). Ana are jetoanele albe, iar Bogdan are jetoanele negre. Jucatorii vor muta alternativ, Ana fiind prima la mutare.
La inceputul jocului toate casutele de pe tabla sunt goale.
La o mutare, jucatorul care este la rand poate plasa un jeton in oricare dintre casutele goale de pe tabla.
Daca o secventa de jetoane consecutive ale adversarului sunt cuprinse intre jetonul abia plasat si un alt jeton (evident de aceeasi culoare) plasat in prealabil, acea secventa de jetoane ale adversarului sunt eliminate de pe tabla.

Cerinta
Scrieti un program care sa determine numarul de jetoane alba si numarul de jetoane negre aflate pe tabla de joc la sfarsitul jocului.

Date de intrare
Fisierul de intrare mgo.in contine pe prima linie doua numere naturale separate prin spatiu P n, unde P reprezinta numarul de casute de pe tabla, iar n numarul de mutari efectuate. Pe urmatoarele n linii sunt descrise in ordine mutarile, cate o mutare pe o linie. O mutare este specificata prin numarul casutei in care este plasat jetonul jucatorului aflat la mutare.

Date de iesire
Fisierul de iesire mgo.out va contine o singura linie pe care vor fi scrise doua numere naturale separate printr-un singur spatiu reprezentand numarul de jetoane albe si respectiv numarul de jetoane negre ramase pe tabla la sfarsitul jocului.

Restrictii
1 <= n <= 1000
1 <= P <= 100

Exemplu

mgo.in
6 8
1
2
5
3
4
6
2
3
mgo.out
2 2
mgo.in
5 6
1
4
5
2
3
2
mgo.out
3 1

Răspunsuri la întrebare

Răspuns de express
0
#include<cstdio>
#include<algorithm>
using namespace std;
int n,i,j,k,a[1000];
int main()
{
int m,min,max,am=0,bm=0;
freopen("mgo.in","r",stdin);
freopen("mgo.out","w",stdout);
scanf("%d %d",&n,&k);
for (i=1;i<=k;i++) if (i%2==1) 
{
scanf("%d",&m);
a[m]=1;
for (min=m-1;min>0;min--) 
if (a[min]==2) continue;
else break;
for (max=m+1;max<n+1;max++) 
if (a[max]==2) continue;
else break;
if (a[min]==1) for (min=min+1;min<m;min++) 
a[min]=0;
if (a[max]==1) for (max=max-1;max>m;max--) 
a[max]=0;
}else
{
scanf("%d",&m);
a[m]=2;
for (min=m-1;min>0;min--) 
if (a[min]==1) continue;
else break;
for (max=m+1;max<n+1;max++) 
if (a[max]==1) continue;
else break;
if (a[min]==2) for (min=min+1;min<m;min++) 
a[min]=0;
if (a[max]==2) for (max=max-1;max>m;max--) 
a[max]=0;
}
for (i=1;i<=n;i++) if (a[i]==1) am++;else if (a[i]==2) bm++;
printf("%d %d\n",am,bm);
return 0;
}

Alte întrebări interesante