#39010: 想問這樣寫bug出在哪? 目前找不出來


wallacechu0409@gmail.com (Wallace Chu)

學校 : 國立臺灣師範大學附屬高級中學
編號 : 136430
來源 : [60.250.158.236]
最後登入時間 :
2024-01-30 11:09:01
m933. 3. 邏輯電路 -- 2024年1月APCS | From: [60.250.158.236] | 發表日期 : 2024-01-07 23:49

#include<bits/stdc++.h>
using namespace std;

int p,q,r,m,a,b,ans=0;
vector<int>v[60010];

struct no{
    int ver;//    第幾號門第幾個位置 number        3 kind cata
    int nv=-1;//    輸入值  input door val       1
    int ki=-1;//  是and還是or..... logic door cata      //2
    int x=-1;       //第一個輸入             //2
    int y=-1;//    第二個輸入 logic input       //2
    int out=0;//這個門的輸出值      2 or    3
    int cnt=0;//經過幾個閘門  door num  every
}he[60010];
queue<no>qqq;

int main(){
    cin>>p>>q>>r>>m;
    for(int i=1;i<=p;i++){
        cin>>he[i].nv;
    }
    for(int i=p+1;i<=p+q;i++){
        cin>>he[i].ki;
    }
    for(int i=1;i<=m;i++){
        cin>>a>>b;
        v[a].push_back(b);
    }
    for(int i=1;i<=p;i++){
        qqq.push({i,he[i].nv,-1,-1,-1,0,0});
    }
    while(!qqq.empty()){
        no it=qqq.front();
        qqq.pop();
        //cout<<it.ver<<endl;
        if(it.ver<=p){//  1
            for(int i=0;i<v[it.ver].size();i++){
                if(v[it.ver][i]<=p+q){//2
                    if(he[v[it.ver][i]].x==-1){
                        he[v[it.ver][i]].x=it.nv;
                    }else if(he[v[it.ver][i]].x!=-1&&he[v[it.ver][i]].y==-1){
                        he[v[it.ver][i]].y=it.nv;
                    }
                    qqq.push({v[it.ver][i],he[v[it.ver][i]].nv,he[v[it.ver][i]].ki,he[v[it.ver][i]].x,he[v[it.ver][i]].y,he[v[it.ver][i]].out,max(he[v[it.ver][i]].cnt,it.cnt+1)});
                }else{//3
                    he[v[it.ver][i]].out=it.nv;
                    he[v[it.ver][i]].cnt=it.cnt;
                }
            }
        }else{//2
            if(he[it.ver].y==-1&&he[it.ver].ki!=4){
                qqq.push(it);
            }else{
                int kk;
                if(he[it.ver].ki==1){
                    kk=(he[it.ver].x&&he[it.ver].y);
                }else if(he[it.ver].ki==2){
                    kk=(he[it.ver].x||he[it.ver].y);
                }else if(he[it.ver].ki==3){
                    kk=(he[it.ver].x^he[it.ver].y);
                }else if(he[it.ver].ki==4){
                    kk=(!he[it.ver].x);
                }
                he[it.ver].out=kk;
                for(int i=0;i<v[it.ver].size();i++){
                    if(v[it.ver][i]<=p+q){//2
                        if(he[v[it.ver][i]].x==-1){
                            he[v[it.ver][i]].x=kk;
                        }else if(he[v[it.ver][i]].x!=-1&&he[v[it.ver][i]].y==-1){
                            he[v[it.ver][i]].y=kk;
                        }
                        qqq.push({v[it.ver][i],he[v[it.ver][i]].nv,he[v[it.ver][i]].ki,he[v[it.ver][i]].x,he[v[it.ver][i]].y,he[v[it.ver][i]].out,max(he[v[it.ver][i]].cnt,it.cnt+1)});
                    }else{//3;
                        he[v[it.ver][i]].out=kk;
                        he[v[it.ver][i]].cnt=it.cnt;
                    }
                }
            }
        }
    }
    for(int i=p+q+1;i<=p+q+r;i++){
        ans=max(ans,he[i].cnt);
    }
    cout<<ans<<endl;
    for(int i=p+q+1;i<=p+q+r;i++){
        cout<<he[i].out<<" ";
    }
}

 
ZeroJudge Forum