理解题意后,没有太大难度,直接模拟就好了,没有坑。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
using namespace std;
typedef struct node{
map<int, int> input;
map<int, int> output;
}node;
node NT[105];
int NP[105];
int n; // 要求模拟的次数
int p; // NT的数量
int flag; // 是否能模拟完n次
int timee;
void simulation()
{
flag = 1;
int ok;
for(int i = 1; i <= n; i++)
{
ok = 0;
for(int j = 1; j <= p; j++)
{
int okk = 1;
int okkk = 0;
for(map<int, int>::iterator it = NT[j].input.begin(); it != NT[j].input.end(); ++it)
{
if(NP[it->first]-it->second < 0)
{
okk = 0;
break;
}
else
{
NP[it->first] -= it->second;
okkk = 1;
}
}
if(okk && okkk)
{
ok = 1;
for(map<int, int>::iterator it = NT[j].output.begin(); it != NT[j].output.end(); ++it)
NP[it->first] += it->second;
break;
}
}
if(!ok)
{
flag = 0;
timee = i;
return;
}
}
}
int main()
{
//freopen("zztest.txt","r",stdin);
//freopen("zans.txt","w",stdout);
int t;
int u = 1;
while(scanf("%d", &t) && t)
{
for(int i = 1; i <= 100; i++)
{
NT[i].input.clear();
NT[i].output.clear();
}
for(int i = 1; i <= t; i++)
scanf("%d ",&NP[i]);
scanf("%d", &p);
for(int i = 1; i <= p; i++)
{
int temp;
while(scanf("%d", &temp) && temp)
{
if(temp < 0)
NT[i].input[-temp]++;
else
NT[i].output[temp]++;
}
}
scanf("%d", &n);
simulation();
//pirnt();
if(flag == 0)
printf("Case %d: dead after %d transitions\n", u++, timee-1);
else
printf("Case %d: still live after %d transitions\n", u++, n);
printf("Places with tokens:");
for(int i = 1; i <= t; i++)
if(NP[i])
printf(" %d (%d)", i, NP[i]);
printf("\n\n");
}
return 0;
}