Files
OI-source/2.804.cpp
2023-08-03 09:22:52 +08:00

94 lines
1.8 KiB
C++

#include <iostream>
#include <cstdio>
#include <cstring>
#define Clean(x, y) memset(x, y, sizeof(x))
//#define rep(i, j, k) for (int i = j; i <= k; i++)
//#define Rrep(i, j, k) for (int i = j; i >= k; i--)
using namespace std;
int np, nt, nf, tp;
const int N = 105;
int num[N];
int input[N][N], output[N][N];
int Inum[N][N];
int find (int x, int k)
{
for(int i=1;i<=input[x][0];i++)
if ( input[x][i] == k) return i;
return -1;
}
void init()
{
Clean(num, 0);
Clean(input, 0);
Clean(output, 0);
Clean(Inum, 0);
for(int i=1;i<=np;i++)
scanf("%d", num + i);
scanf("%d", &nt);
for(int i=1;i<=nt;i++)
{
while (scanf("%d", &tp), tp)
{
if ( tp < 0 )
{
int p = find(i, -tp);
if ( p != -1 ) Inum[i][p]++;
else
{
input[i][++input[i][0]] = -tp;
Inum[i][input[i][0]] = 1;
}
}
else output[i][ ++output[i][0] ] = tp;
}
}
scanf("%d", &nf);
}
bool check (int x)
{
for(int i=1;i<=input[x][0];i++)
if ( num [ input[x][i] ] < Inum[x][i] ) return false;
return true;
}
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
#endif
int kase = 0;
while ( cin >> np && np != 0)
{
init();
int step = 0;
bool can = true;
while (can && step < nf)
{
can = false;
for(int k=1;k<=nt;k++)
{
if ( step < nf && check(k) )
{
can = true;
step++;
for(int i=1;i<=input[k][0];i++)
num[ input[k][i] ] -= Inum[k][i];
for(int i=1;i<=output[k][0];i++)
num[ output[k][i] ]++;
}
}
}
printf("Case %d: ",++kase);
if ( step == nf ) printf("still live after %d transitions\n",nf);
else printf("dead after %d transitions\n",step);
printf("Places with tokens:");
for(int i=1;i<=np;i++)
if (num[i]) printf(" %d (%d)",i,num[i]);
printf("\n\n");
}
return 0;
}