第十九天 2021-3-28备战CCFCSP
刷题模块:CCF 202009
202009-3
个人代码
使用多态的思想,为每一个逻辑门构建一个对象
用输入驱动输出
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cstdlib>
using namespace std;
class GATE{
public:
int inNum;
GATE *next[100];
int nextNum;
bool *inSignal; //输入信号数组
int inPointer; //输入信号数组指针
int outSignal;
string gateType;
GATE(int inNum){
this->inNum=inNum; //输入信号数量
this->inPointer=0;
this->nextNum=0;
this->outSignal=0;
this->inSignal=new bool[inNum];
}
void setNext(GATE *next){ this->next[nextNum++]=next;}
int getOutput(){return outSignal;}
virtual void input(bool signal){}
};
class inPointer{
public:
GATE *next[100];
int nextNum;
inPointer(){
this->nextNum=0;
}
void setNext(GATE *next){
this->next[nextNum++]=next;
}
void actNext(bool inSignal){
for(int i=0;i<nextNum;i++){
this->next[i]->input(inSignal);
}
}
};
class NOT:public GATE{
public:
NOT(int inNum):GATE(inNum){gateType="NOT";}
void input(bool signal){
inSignal[inPointer++]=signal;
//输入全部就位,驱动下一个逻辑门
//根据不同逻辑门的属性使用输入驱动输出
if(inPointer==inNum){
outSignal=!inSignal[0];
for(int i=0;i<nextNum;i++){
next[i]->input(outSignal);
}
inPointer=0; //指针归位
}
}
};
class AND:public GATE{
public:
AND(int inNum):GATE(inNum){gateType="AND";}
void input(bool signal){
inSignal[inPointer++]=signal;
//输入全部就位,驱动下一个逻辑门
//根据不同逻辑门的属性使用输入驱动输出
if(inPointer==inNum){
for(int i=1;i<inNum;i++){
inSignal[0]=inSignal[0]&inSignal[i];
}
outSignal=inSignal[0];
for(int i=0;i<nextNum;i++){
next[i]->input(outSignal);
}
inPointer=0; //指针归位
}
}
};
class OR:public GATE{
public:
OR(int inNum):GATE(inNum){gateType="OR";}
void input(bool signal){
inSignal[inPointer++]=signal;
//输入全部就位,驱动下一个逻辑门
//根据不同逻辑门的属性使用输入驱动输出
if(inPointer==inNum){
for(int i=1;i<inNum;i++){
inSignal[0]=inSignal[0]|inSignal[i];
}
outSignal=inSignal[0];
for(int i=0;i<nextNum;i++){
next[i]->input(outSignal);
}
inPointer=0; //指针归位
}
}
};
class XOR:public GATE{
public:
XOR(int inNum):GATE(inNum){gateType="XOR";}
void input(bool signal){
inSignal[inPointer++]=signal;
//输入全部就位,驱动下一个逻辑门
//根据不同逻辑门的属性使用输入驱动输出
if(inPointer==inNum){
for(int i=1;i<inNum;i++){
inSignal[0]=inSignal[0]^inSignal[i];
}
outSignal=inSignal[0];
for(int i=0;i<nextNum;i++){
next[i]->input(outSignal);
}
inPointer=0; //指针归位
}
}
};
class NAND:public GATE{
public:
NAND(int inNum):GATE(inNum){gateType="NAND";}
void input(bool signal){
inSignal[inPointer++]=signal;
//输入全部就位,驱动下一个逻辑门
//根据不同逻辑门的属性使用输入驱动输出
if(inPointer==inNum){
for(int i=1;i<inNum;i++){
inSignal[0]=inSignal[0]&inSignal[i];
}
outSignal=!inSignal[0];
for(int i=0;i<nextNum;i++){
next[i]->input(outSignal);
}
inPointer=0; //指针归位
}
}
};
class NOR:public GATE{
public:
NOR(int inNum):GATE(inNum){gateType="NOR";}
void input(bool signal){
inSignal[inPointer++]=signal;
//输入全部就位,驱动下一个逻辑门
//根据不同逻辑门的属性使用输入驱动输出
if(inPointer==inNum){
for(int i=1;i<inNum;i++){
inSignal[0]=inSignal[0]|inSignal[i];
}
outSignal=!inSignal[0];
for(int i=0;i<nextNum;i++){
next[i]->input(outSignal);
}
inPointer=0; //指针归位
}
}
};
int Q;
GATE *gate[500];
bool saveInSign[10000][2500];
int main(){
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d",&Q);
int M,N,S; //输入数量,逻辑门数量,运行次数
string logic; //逻辑门名称
string inName; //输入名称
char inType;
int inID;
int inNum,inFrom; //输入数量,输入来源
inPointer *sysInput[2500]; //输入信号指针,指向需要激活的门
while(Q--){
scanf("%d%d",&M,&N);
//构建电路
for(int i=0;i<N;i++){
cin>>logic>>inNum;
if(logic=="NOT") {gate[i]=new NOT(inNum);}
else if(logic=="AND") {gate[i]=new AND(inNum);}
else if(logic=="OR") {gate[i]=new OR(inNum);}
else if(logic=="XOR") {gate[i]=new XOR(inNum);}
else if(logic=="NAND") {gate[i]=new NAND(inNum);}
else if(logic=="NOR") {gate[i]=new NOR(inNum);}
else{printf("ERROR:logicgate name is error");}
for(int j=0;j<inNum;j++){
cin>>inName;
inType=inName.at(0);
inID=atoi(inName.erase(0,1).c_str())-1;
if(inType=='I'){
if(sysInput[inID]==nullptr) sysInput[inID]=new inPointer();
sysInput[inID]->setNext(gate[i]);
}else if(inType=='O'){
gate[inID]->setNext(gate[i]);
}
}
}
//获取输入
cin >> S;
for(int i=0;i<S;i++){
for(int j=0;j<M;j++){
cin>>saveInSign[i][j];
}
}
//根据输出格式输出
for(int i=0;i<S;i++){
//驱动整个组合电路完成运算
for(int j=0;j<M;j++){
sysInput[j]->actNext(saveInSign[i][j]);
}
//根据要求输出结果
int needOut;
cin >>needOut;
for(int k=0;k<needOut;k++){
int needGate;
cin >>needGate;
printf("%d",gate[needGate-1]->outSignal);
if(k!=needOut-1) printf(" ");
}
printf("\n");
}
}
return 0;
}
大佬解法:图、邻接矩阵、拓扑排序
点亮数字人生( 202009-3/CCF)———附带思路和完整代码(邻接表、邻接矩阵)