Leetcode刷题笔记22:202009

第十九天 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)———附带思路和完整代码(邻接表、邻接矩阵)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值