题目背景

土豪大学的计算机系开了一门数字逻辑电路课,第一个实验叫做“点亮数字人生”,要用最基础的逻辑元件组装出实际可用的电路。时间已经是深夜了,尽管实验箱上密密麻麻的连线已经拆装了好几遍,小君同学却依旧没能让她的电路正常工作。你能帮助她模拟出电路的功能,成功点亮她的数字人生吗?

问题描述

本题中,你需要实现一个简单的数字逻辑电路模拟器。如果你已经有了此方面的基础,可以直接跳过本节。在阅读时,也可以参照前两个样例的图示和解释,这有助于你更好地理解数字逻辑电路的工作原理。

数字逻辑电路是用来传输数字信号(也就是二进制信号)的电路。一般来说,数字逻辑电路可以分为两大类,即组合逻辑(combinational logic)电路和时序逻辑(sequential logic)电路。在本题中,我们仅关注组合逻辑电路。这种电路仅由逻辑门(logical gate)构成。一个逻辑门可以理解为一个多输入单输出的函数,输入端连接至少一个信号,而后经过一定的逻辑运算输出一个信号。常见的逻辑门包括与(AND)、或(OR)、非(NOT)、异或(XOR)等,均与编程语言中的按位运算是对应的。

将一系列的逻辑门连接起来,就能构成具有特定功能的电路。它的功能可能很简单(如一位二进制加法只需要一个异或门),也可能极其复杂(如除法)。无论复杂程度,这类电路的特点是:它不维持任何的状态,任何时刻输出只与输入有关,随输入变化。真实世界中的逻辑器件由于物理规律的限制,存在信号传播延时。为了简单起见,本题中我们模拟的组合逻辑电路不考虑延时:一旦输入变化,输出立刻跟着变化。

考虑到组合逻辑电路的这一特性,设计时不能允许组合环路(combinational loop)的存在,即某逻辑门的输入经过了一系列器件之后又被连接到了自己的输入端。真实世界中,这种做法将导致电路变得不稳定,甚至损坏元器件。因此,你也需要探测可能的环路。需要注意,环路的存在性与逻辑门的具体功能没有任何关系;只要连接关系上存在环路,电路就无法正常工作。

输入格式

输入数据包括若干个独立的问题,第一行一个整数QQQ,满足 111≤\leq≤QQQ ≤\leq≤QmaxQ_{max}Qmax​。接下来依次是这 个问题的输入,你需要对每个问题进行处理,并且按照顺序输出对应的答案。

每一个问题的输入在逻辑上可分为两部分。第一部分定义了整个电路的结构,第二部分定义了输入和输出的要求。实际上两部分之间没有分隔,顺序读入即可。

第一部分

第一行是两个空格分隔的整数M,NM,NM,N,分别表示了整个电路的输入和器件的数量,满足 1≤N≤Nmax1\leq N \leq N_{max}1≤N≤Nmax​并且0≤M≤kmaxN0\leq M \leq k_{max}N0≤M≤kmax​N 。其中 kmaxk_{max}kmax​和 NmaxN_{max}Nmax​都是与测试点编号有关的参数。

接下来 行,每行描述一个器件,编号从 1 开始递增,格式如下:

FUNC k L_1 L_2 ... L_k

其中 FUNC 代表具体的逻辑功能, 表示输入的数量,后面跟着该器件的 个输入端描述 ,格式是以下二者之一:

Im:表示第 m 个输入信号连接到此输入端,保证111≤\leq≤mmm≤\leq≤MMM
On:表示第 n 个器件的输出连接到此输入端,保证111≤\leq≤nnn≤\leq≤NNN
所有可能的 FUNC 和允许的输入端数量如下表所述:

所有的器件均只有一个输出,但这个输出信号可以被用作多个器件的输入。

第二部分

第一行是一个整数SSS,表示此电路需要运行SSS次。每次运行,都会给定一组输入,并检查部分器件的输出是否正确。 满足1≤S≤Smax1 \leq S \leq S_{max}1≤S≤Smax​,其中 SmaxS_{max}Smax​是一个与测试点编号有关的参数。

接下来的 行为输入描述,每一行的格式如下:

I_1 I_2 … I_M

每行有 MMM个可能为 0 或 1 的数字,表示各个输入信号(按编号排列)的状态。

接下来的 SSS行为输出描述,每一行的格式如下:

s_i O_1 O_2 … O_s
第一个整数 1≤si≤N1 \leq si \leq N1≤si≤N表示需要输出的信号数量。后面共有 sis_{i}si​个在 111到 NNN之间的数字,表示在对应的输入下,组合逻辑完成计算后,需要输出结果的器件编号。

注意 OOO序列不一定是递增的,即要求输出的器件可能以任意顺序出现。

输出格式

对于输入中的 QQQ个问题,你需要按照输入顺序输出每一个问题的答案:

如果你检测到电路中存在组合环路,则请输出一行,内容是 LOOP,无需输出其他任何内容。

如果电路可以正常工作,则请输出SSS行,每一行包含sis_{i}si​个用空格分隔的数字(可能为 0 或 1),依次表示“输出描述”中要求的各个器件的运算结果。

样例输入1

1
3 5
XOR 2 I1 I2
XOR 2 O1 I3
AND 2 O1 I3
AND 2 I1 I2
OR 2 O3 O4
4
0 1 1
1 0 1
1 1 1
0 0 0
2 5 2
2 5 2
2 5 2
2 5 2

样例输出1

1 0
1 0
1 1
0 0

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
struct Node{int opt;vector<int>In;vector<int>Out;
}Dev[505];
int Input[N][505],Ind[505],ans[505];
vector<int>e[505];
int getNum(int pos,char *str){int num=0;int len=strlen(str);while(pos<len){num=num*10+str[pos]-'0';++pos;}return num;
}
int Operation(vector<int>q,int opt){if(opt==0) return !q[0];else{int cnt=q.size();int r=q[0];if(opt==1){for(int i=1;i<cnt;++i) r&=q[i];return r;}else if(opt==2){for(int i=1;i<cnt;++i) r|=q[i];return r;}else if(opt==3){for(int i=1;i<cnt;++i) r^=q[i];return r;}else if(opt==4){for(int i=1;i<cnt;++i) r&=q[i];return !r;}for(int i=1;i<cnt;++i) r|=q[i];return !r;}
}
int dfs(int s,int u){if(ans[u]!=-1) return ans[u];int cnt=Dev[u].In.size();vector<int>t;for(int i=0;i<cnt;++i){t.push_back(Input[s][Dev[u].In[i]]);}cnt=Dev[u].Out.size();for(int i=0;i<cnt;++i){t.push_back(dfs(s,Dev[u].Out[i]));}return ans[u]=Operation(t,Dev[u].opt);
}
bool topolog(int n){queue<int>Q;for(int i=1;i<=n;++i){if(!Ind[i]) Q.push(i);}int cnt=0;while(!Q.empty()){int u=Q.front();Q.pop();++cnt;int cnt=e[u].size();for(int i=0;i<cnt;++i){int v=e[u][i];if(!(--Ind[v])) Q.push(v);}}return cnt==n;
}
int main(){map<string,int>Mp;Mp["NOT"]=0;Mp["AND"]=1;Mp["OR"]=2;Mp["XOR"]=3;Mp["NAND"]=4;Mp["NOR"]=5;char str[10];int Q;scanf("%d",&Q);while(Q--){int m,n;scanf("%d%d",&m,&n);    //电路和器件数量for(int i=1;i<=n;++i){e[i].clear();Ind[i]=0;Dev[i].In.clear();Dev[i].Out.clear();}for(int i=1;i<=n;++i){   //每个器件scanf("%s",str);Dev[i].opt=Mp[str];int k;scanf("%d",&k);for(int j=0;j<k;++j){scanf("%s",str);int num=getNum(1,str);if(str[0]=='I') Dev[i].In.push_back(num);else{e[num].push_back(i);Ind[i]++;Dev[i].Out.push_back(num);}}}int S;scanf("%d",&S);for(int i=0;i<S;++i){for(int j=1;j<=m;++j) scanf("%d",&Input[i][j]);}bool fg=topolog(n);if(!fg) puts("LOOP");for(int i=0;i<S;++i){int s,num;scanf("%d",&s);memset(ans,-1,sizeof(ans));for(int j=0;j<s;++j){scanf("%d",&num);if(fg) printf("%d%c",dfs(i,num),j==s-1?'\n':' ');}}}return 0;
}

CCF CSP 点亮数字人生(记忆化搜索+拓扑排序判环)相关推荐

  1. 洛谷3953 (NOIp2017) 逛公园——记忆化搜索+用栈判0环

    题目:https://www.luogu.org/problemnew/show/P3953 因为K只有50,所以想到用dp[ cr ][ j ]表示在点cr.比最短路多走了 j 的方案数.(看了TJ ...

  2. jzoj6451-[2020.01.19NOIP提高组]不幸运数字【记忆化搜索,数位dp,高精度】

    正题 题目链接:https://jzoj.net/senior/#main/show/6451 题目大意 给出a,ba,ba,b,求[a,b][a,b][a,b]这个区间中有多少数字包含444. 解题 ...

  3. bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)

    1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...

  4. 数字三角形——递归、递推、记忆化搜索

    数字三角形 描述:          有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数. 问题:              从第一行的数开始,每次可以往左 ...

  5. P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles(记忆化搜索)--- 89分

    [USACO1.5][IOI1994]数字三角形 Number Triangles - 洛谷 /* P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles(记忆 ...

  6. 51Nod-1009 数字1的数量【数位DP+记忆化搜索】

    1009 数字1的数量  给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. ...

  7. 经典算法——数字三角形的三种解题方法:递推、记忆化搜索、动态规划

    上题目链接: http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1730.html  递推方法: i ...

  8. 第23次CSP认证 第4题 收集卡牌(记忆化搜索,状压)

    链接:http://118.190.20.162/view.page?gpid=T132 思路:先写一个暴力搜索,然后把中间结点的状态存起来,就是记忆化搜索,状态要存搜索到的层数和选择的卡牌数,0代表 ...

  9. Codeforces Round #637 (Div. 2) - Thanks, Ivan Belonogov! D. Nastya and Scoreboard题解(记忆化搜索)

    题目链接 题目大意 一个n个数码位的分数板,每一个数码位都是一个七段数码管,现在给出每个数码位的显示情况,问再点亮k段数码管的话能显示的最大的数是多少,如果不能构成一串数字,就输出-1.答案允许有前导 ...

最新文章

  1. 女性程序员占比超17%,平均月薪近2万 | 程序员就业大数据报告
  2. html中放大镜案列,Canvas实现放大镜效果完整案例分析(附代码)
  3. SQL注入——报错注入
  4. 为什么选择Java?Java具体好在哪?
  5. OpenCV学习笔记(一)——OpenCV3.1.0+VS2015开发环境配置
  6. 图像处理理论(一)——直方图、二值化、滤波基础
  7. 与ln的指数转化公式_高考数学48条秒杀型公式与方法
  8. Java——获取和设置多线程的名称
  9. 前端学习(525):等分布局
  10. 用.net core实现反向代理中间件
  11. 自定义OutputFormat案例实操
  12. 微信小程序开发教程!
  13. linux识别csr8510,【记录】给CSR8510 A10芯片的USB转蓝牙模块安装驱动
  14. Python报错:IndentationError: unindent does not match any outer indentation level问题的解决办法及原因
  15. 空气质量等级c语言编程,关于SDS011模块(空气中pm2.5及pm10)单片机c程序实现(链接附源码)...
  16. canvas实现橡皮擦
  17. 中国电子学会2022年09月份青少年软件编程Scratch图形化等级考试试卷三级真题(含答案)
  18. O2O到家业务:如何在配送履约环节,做到极致优化?
  19. DayDayUp:计算机技术与软件专业技术资格证书之《系统集成项目管理工程师》课程讲解之项目管理概述、项目管理基本基础知识、项目立项管理相关知识
  20. Python 用 OpenCV 实现 PS 高光/阴影选区

热门文章

  1. LLDP链路层发现协议
  2. python 异常处理 库_python捕获数据库异常处理
  3. php模拟登陆青果教务系统,模拟登录 - php CURL模拟登陆正方教务系统
  4. 大数据技术之 Sqoop
  5. 怎么主动发起话题_聊天怎么开启话题?学会这四点,再也不担心尴尬开场
  6. 大学物理复习2-动量守恒定律的应用+质心运动定理
  7. 中字符转换中文乱码的处理方法
  8. 消息称华为与中兴均将裁员解困
  9. java基本类型和使用
  10. emplace_back()