您的位置:首页 > 其它

[中等] UVa OJ 804 Petri Net Simulation

2017-09-01 19:45 295 查看
题目描述

思路:

本题实际上只是个简单的模拟,只不过题目比较长,理解起来有些难度,故划为中等难度。

不过另人费解的是我下面的代码不论我如何修改输出格式总是PE,如果哪位读者发现我下面代码输出格式的问题,还请评论指出,在此提前表示感谢。

具体代码:

#include <iostream>
#include <vector>

using namespace std;
const int maxn=100+4;
vector<int> Tin[maxn];
vector<int> Tout[maxn];
struct State
{
int P[maxn];
};
State st;
State stbk;
int np;
int nt;
int simulate(int fn)
{
for(int i=0;i<fn;++i)
{
bool dead=true;
for(int j=1;j<=nt;++j)
{
bool ok=true;
stbk=st;
for(int k=0;k<Tin[j].size();++k)
{
if(stbk.P[Tin[j][k]]<1)
{
ok=false;
break;
}
--stbk.P[Tin[j][k]];
}
if(ok)
{
for(int k=0;k<Tin[j].size();++k)
--st.P[Tin[j][k]];
for(int k=0;k<Tout[j].size();++k)
++st.P[Tout[j][k]];
dead=false;
break;
}
}
if(dead)
return i;
}
return -1;
}
int main()
{
//freopen("input.txt","r",stdin);
int kase=0;
for(cin>>np;np!=0;cin>>np)
{
++kase;
for(int i=1;i<=np;++i)
{
cin>>st.P[i];
}
cin>>nt;
for(int i=1;i<=nt;++i)
{
Tin[i].clear();
Tout[i].clear();
int t;
for(cin>>t;t!=0;cin>>t)
{
if(t<0)
Tin[i].push_back(-t);
else
Tout[i].push_back(t);
}
}
int fireNum;
cin>>fireNum;
int result=simulate(fireNum);
if(result==-1)
cout<<"Case "<<kase<<": still live after "<<fireNum<<" transitions"<<endl;
else
cout<<"Case "<<kase<<": dead after "<<result<<" transitions"<<endl;
cout<<"Places with tokens: ";
bool f2=true;
for(int i=1;i<=np;++i)
{
if(st.P[i]>0)
{
if(f2)
f2=false;
else
cout<<" ";
cout<<i<<" ("<<st.P[i]<<")";
}
}
cout<<endl<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  模拟