CCF CSP 202009-3 点亮数字人生
本题主要考察 有向图是否存在环路,记忆化搜索,状态压缩存储。
#include <bits/stdc++.h>
//#include <iostream>
//#include <queue>
//#include <string>using namespace std;
int Q, M, N, S;using ll = long long;// 状态压缩
ll input[10005][40];short output[505];bool hasloop;struct node {int op = 0; // 0 not, 1 and, 2 or, 3 xor, 4 nand, 5 norint from[7]; // 如果从器件得到是整数,如果是从 input 得到是负数
}elem[505];int res[505]; // 运算结果, 如果结果未初始化是 0,初始化了是 1/-1void mset(int t, int i) {int index = i / 64;int loc = i % 64;input[t][index] |= (1 << loc);
}int read(int t, int i) {--i;int index = i / 64;int loc = i % 64;return (input[t][index] >> loc) & 0x1;
}bool vis[505];
void test() {memset(vis, 0, sizeof(vis));hasloop = false;for (int i = 1; i <= N; ++i) {if (vis[i]) continue;queue<int> q;q.push(i);int mvis[505];memset(mvis, 0, sizeof(mvis));mvis[i] = true;while(!q.empty()) {int f = q.front(); q.pop();for (int j = 0; j < 5; ++j) {if (elem[f].from[j] == 0) break;if (elem[f].from[j] > 0) {int to = elem[f].from[j];if (mvis[to]) {hasloop = true;return;}if (vis[to]) continue;vis[to] = mvis[to] = true;q.push(to);}}}}
}int getRes(int no, int t) {// cout << "no = " << no << ", op = " << elem[no].op << endl << "input: " << endl;
// for (int i = 0; i < 5; ++i) {// cout << elem[no].from[i] << ", ";
// }
// cout << endl;if (res[no] != 0) return res[no] == 1 ? 1 : 0;int fv[5];memset(fv, 0, sizeof(fv));int cnt = 0;for (int i = 0; i < 5; ++i) {if (elem[no].from[i] == 0) break;if (elem[no].from[i] < 0) {fv[i] = read(t, -elem[no].from[i]);} else {fv[i] = getRes(elem[no].from[i], t);}cnt++;}int v = fv[0];switch (elem[no].op) {case 0:v = !v; break;case 1:while (--cnt) {v &= fv[cnt];}break;case 2:while (--cnt) {v |= fv[cnt];}break;case 3:while (--cnt) {v ^= fv[cnt];}break;case 4:while (--cnt) {v &= fv[cnt];}v = !v;break;case 5:while (--cnt) {v |= fv[cnt];}v = !v;break;} // end switchif (v == 0) res[no] = -1;else res[no] = 1;
// cout << "no = " << no << ", res = " << res[no] << endl;return v;
}void solve() {cin >> M >> N;memset(elem, 0, sizeof(elem));for (int i = 1; i <= N; ++i) {string func;int k;string op;cin >> func >> k;if (func == "AND") elem[i].op = 1;else if (func == "OR") elem[i].op = 2;else if (func == "XOR") elem[i].op = 3;else if (func == "NAND") elem[i].op = 4;else if (func == "NOR") elem[i].op = 5;for (int j = 0; j < k; ++j) {cin >> op;int t = atoi(op.substr(1).c_str());if (op[0] == 'I') {elem[i].from[j] = -t;} else {elem[i].from[j] = t;}}}// part 2memset(input, 0, sizeof(input));cin >> S;for (int i = 0; i < S; ++i) {int bit;for (int j = 0; j < M; ++j) {cin >> bit;if (bit) {mset(i, j);}}}// 测试是否有环test();if (hasloop) {cout << "LOOP" << endl;}for (int t = 0; t < S; ++t) {int s;cin >> s;for (int j = 0; j < s; ++j) {cin >> output[j];}if (!hasloop) {memset(res, 0, sizeof(res));for (int j = 0; j < s; ++j) {cout << getRes(output[j], t) << " ";}cout << endl;}
// cout << "debug::" << endl;
// for (int k = 1; k <= N; ++k) {// cout << getRes(k, t) << " ";
// }
// cout << endl << endl;}
}int main() {cin >> Q;while(Q--) solve();return 0;
}
CCF CSP 202009-3 点亮数字人生相关推荐
- 第 20 次 CSP认证 202009-3 点亮数字人生
样例一输入: 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 ...
- CCF CSP 点亮数字人生(记忆化搜索+拓扑排序判环)
题目背景 土豪大学的计算机系开了一门数字逻辑电路课,第一个实验叫做"点亮数字人生",要用最基础的逻辑元件组装出实际可用的电路.时间已经是深夜了,尽管实验箱上密密麻麻的连线已经拆装了 ...
- CCF CSP认证历年真题 满分代码(持续更新中)
目标 在接下来的半年到一年时间内,补全CCF认证历年真题(A-D)的满分代码(E题随缘). 考虑到CCF认证这个东西是可以混分的,我计划对D.E题额外增加部分分代码,或许有助于不同层次的选手备赛. 除 ...
- CCF CSP认证考试题解目录
由于本人的书籍<算法详解(C++11 语言描述)>已经出版,为了降低题解的维护难度,有关CCF CSP考试的所有题解的更新将全部在书籍的配套仓库进行,CSDN博客中不再进行任何题解的更新. ...
- CCF CSP 201812-2 小明放学 解题思路及经验总结
更新:多谢weixin_44714465同学指出我的错误[详见49-52行代码,已改正!].CCF CSP的OJ居然没有把这个错误检测出来,不过为了追求严谨,我们还是应该及时改正! 题目描述 试题编号 ...
- CCF CSP认证菜鸟刷题日志
CCF CSP菜鸟刷题日志(c/c++) 本萌新写给自己看的,要是有大佬路过,请多多指教orz 立个flag:每日一更,至201903 9月15ccf csp,冲鸭! 今天(2019.8.18)起每天 ...
- CCF CSP 201609-2 火车购票
题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...
- 计算机能力挑战赛_蓝桥杯、PAT、CCF CSP、团体程序设计天梯赛、传智杯、计算机能力挑战赛、软考等大学生编程比赛/考试介绍...
介绍7个适合普通大学生参加的编程比赛/考试(注:有的比赛如蓝桥杯有多种赛别,本文仅介绍其中的程序设计/编程比赛). 编程入门书籍推荐<算法笔记>,内容详细易懂,对新手非常友好,描述语言为C ...
- 以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系
原文链接:以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系 发布单位:学会 发布时间:2017-01-20 16:16 作者:陆建峰 余立功 摘要:为提升计算机专业类学生 ...
- ccf csp寻宝!大冒险!(C语言)
ccf csp寻宝!大冒险! 题目背景 暑假要到了.可惜由于种种原因,小 P 原本的出游计划取消.失望的小 P 只能留在西西艾弗岛上度过一个略显单调的假期--直到-- 某天,小 P 获得了一张神秘的藏 ...
最新文章
- linux 设备树调试必须知道的几个路径
- php 5.2 mysqli_PHP5安装好后添加mysqli扩展支持 | 学步园
- node windows更新_node.js 01 简介 - 产生,发展历程,优势,适用场景,实际应用
- LVS负载均衡:三种工作模式、十种调度算法
- 【数学基础】概率论——p(x|\theta)和p(x;\theta)的区别
- 浅谈离线化方案的探索,跨容器
- 空军军医大学计算机复试线,2021空军军医大学考研国家线公布时间_国家线是多少分...
- 运用hanlp 通过 python 结合jpype 导出依存句法可视化
- Java笔记1(2015-8-30)
- word转PDF时,英文单词的字母间距问题
- 微信小程序赞赏功能,非微信赞赏功能
- 联想ghost重装系统_联想笔记本重装系统图文教程
- spring boot启动报错: The APR based Apache Tomcat Native library which allows optimal performance
- 【渝粤教育】国家开放大学2018年秋季 1318T社会统计学 参考试题
- bzoj 4805: 欧拉函数求和
- IDEA 数组遍历快捷键
- 2013应届毕业生各大IT公司待遇整理汇总篇(转)
- 【CVPR 2021】Knowledge Review:知识蒸馏新解法
- 设计误区之一-正无穷
- hbck源码系列(四)--表的完整性检查和修复Check