[中等] UVa OJ 804 Petri Net Simulation

题目描述

思路:

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

不过另人费解的是我下面的代码不论我如何修改输出格式总是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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值