Java实现 蓝桥杯 算法训练 My Bad(暴力)
试题 算法训练 My Bad
问题描述
一个逻辑电路将其输入通过不同的门映射到输出,在电路中没有回路。输入和输出是一个逻辑值的有序集合,逻辑值被表示为1和0。我们所考虑的电路由与门(and gate,只有在两个输入都是1的时候,输出才为1)、或门(or gate,只要两个输入中有一个是1,输出就是1)、异或门(exclusive or(xor)gate,在两个输入中仅有一个是1,输出才是1)和非门(not gate,单值输入,输出是输入的补)组成。下图给出两个电路。
不幸的是,在实际中,门有时会出故障。虽然故障会以多种不同的方式发生,但本题将门会出现的故障限于如下三种形式之一:
1)总是与正确的输出相反;
2)总是产生0;
3)总是产生1;
在本题给出的电路中,最多只有一个门出故障。
请编写一个程序,对一个电路进行分析,对多组输入和输出进行实验,看电路运行是正确的还是不正确的。如果至少有一组输入产生了错误的输出,程序要确定唯一的出故障的门,以及这个门出故障的方式。但这也可能是无法判断的。
输入格式
输入由多组测试数据组成,每组测试用例描述了一个电路及其输入和输出。每个测试数据按序给出下述部分。
1. 一行给出3个正整数:在电路中输入的数量(N ≤ 8),门的数量(G ≤ 19)和输出的数量(U ≤ 19)。
2. 每行一个门,第一行描述g1门,如果有若干个门,则下一行描述g2门,以此类推。每行给出门类型(a = and,n = not,o = or,x = exclusive or)和对这个门的所有输入的标识符,对这个门的输入来自电路输入(i1, i2, …)或来自另一个门的输出(g1, g2, …)。
3. 一行给出与U个输出u1, u2, ….所关联的门的编号。例如,如果有三个输出,u1来自g5,u2来自g1,u3来自g4,那么这一行为:5 1 4。
4. 一行给出一个整数,表示对电路的进行实验的次数(B)。
5. 最后给出B行,每行(N+U)个值(1和0),给出实验的输入值和相应的输出值。不存在有两个相同输入的情况。
输入中的标识符或数字以空格分开,输入以包含3个0的一行结束。
输出格式
对于输入数据中的每个电路,输出测试数据的编号(从1开始),然后输出一个冒号和一个空格,再输出电路分析,内容为如下之一(用#代替相应的门的编号):
No faults detected
Gate # is failing; output inverted
Gate # is failing; output stuck at 0
Gate # is failing; output stuck at 1
Unable to totally classify the failure
在图1和图2 中给出的电路图是第一个和最后一个测试数据。
样例输入
2 2 1
o i1 i2
n g1
2
2
1 0 0
0 0 1
2 1 1
a i1 i2
1
1
1 0 1
2 1 1
a i1 i2
1
2
1 0 1
1 1 1
1 1 1
n i1
1
2
1 1
0 0
3 4 4
n g4
a i1 i2
o i2 i3
x i3 i1
2 3 4 1
4
0 1 0 0 1 0 1
0 1 1 0 1 1 0
1 1 1 0 1 0 1
0 0 0 0 0 0 1
0 0 0
样例输出
Case 1: No faults detected
Case 2: Unable to totally classify the failure
Case 3: Gate 1 is failing; output stuck at 1
Case 4: Gate 1 is failing; output inverted
Case 5: Gate 2 is failing; output stuck at 0
数据规模和约定N<=8;G,U<=19
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;public class Main { public static void main(String[] args) throws IOException { // 转自: https://blog.csdn.net/a1439775520 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));StringTokenizer tokenizer = new StringTokenizer("");int kk = 0;while (true) {tokenizer = new StringTokenizer(reader.readLine());int in = Integer.parseInt(tokenizer.nextToken());int door = Integer.parseInt(tokenizer.nextToken());int out = Integer.parseInt(tokenizer.nextToken());if (in == 0 && door == 0 && out == 0)break;kk++;System.out.printf("Case %d: ", kk);Door d[] = new Door[20];for (int i = 1; i <= door; i++) {tokenizer = new StringTokenizer(reader.readLine());String kind = tokenizer.nextToken();int incont = 2;if (kind.equals("n"))incont = 1;int kinda = -1;if (kind.equals("a"))kinda = 1;else if (kind.equals("o"))kinda = 2;else if (kind.equals("x"))kinda = 3;else if (kind.equals("n"))kinda = 4;String aa = tokenizer.nextToken();int ina = Integer.parseInt(aa.substring(1));// System.out.println("ina :" + ina);if (aa.charAt(0) == 'i')ina = -ina;int inb = 0;if (incont == 2) {String bb = tokenizer.nextToken();inb = Integer.parseInt(bb.substring(1));// System.out.println("inb :" + inb);if (bb.charAt(0) == 'i')inb = -inb;}d[i] = new Door(i, kinda, ina, inb);}boolean[] visit = new boolean[60];for (int i = 0; i <= 3 * door; i++)visit[i] = true;int[] s = new int[20];int[] o = new int[20];int conts = 0;for (int i = 1; i <= door; i++) {int inta = d[i].ina;int intb = d[i].inb;if (inta > 0)d[inta].addout(i);if (intb > 0)d[intb].addout(i);if (inta <= 0 && intb <= 0)s[conts++] = i;}tokenizer = new StringTokenizer(reader.readLine());for (int i = 0; i < out; i++)o[i] = Integer.parseInt(tokenizer.nextToken());int test = Integer.parseInt(reader.readLine());int[] ins = new int[10];String outs = "";String res = "";for (int i = 0; i < test; i++) {tokenizer = new StringTokenizer(reader.readLine());for (int j = 1; j <= in; j++)ins[j] = Integer.parseInt(tokenizer.nextToken());outs = "";for (int j = 0; j < out; j++)outs += tokenizer.nextToken();for (int cas = 0; cas <= 3 * door; cas++) {if (visit[cas]) {for (int j = 1; j <= door; j++)d[j].cont = d[j].have = 0;for (int j = 0; j < conts; j++) {int id = s[j];d[id].cal(ins, d, cas);}res = "";for (int j = 0; j < out; j++)res += String.valueOf(d[o[j]].value);if (outs.equals(res) == false)visit[cas] = false;}}}if(visit[0] == true)System.out.println("No faults detected");else {int one = -1;boolean mark = true;for(int i = 0; i<=3*door; i++) {if(visit[i] == true){if(one == -1)one = i;else{mark = false;break;}}}if(mark) {int id = (one-1)/3 + 1;int r = one%3;if(r == 0)r+=3;if(r == 1)System.out.printf("Gate %d is failing; output inverted\n", id);else if(r == 2)System.out.printf("Gate %d is failing; output stuck at 0\n", id);else if(r == 3)System.out.printf("Gate %d is failing; output stuck at 1\n", id);}elseSystem.out.println("Unable to totally classify the failure");}}}
}class Door {int id;int incont;int cont;int ina, inb;int kind;int outcont;int va, vb, value;int[] out = new int[20];int have;public Door(int id_, int kind_, int ina_, int inb_) {id = id_;kind = kind_;ina = ina_;inb = inb_;incont = 0;if (ina > 0)incont++;if (inb > 0)incont++;outcont = cont = have = 0;}public void addout(int num) {out[outcont++] = num;}public void cal(int[] ins, Door[] d, int cas) {if (ina < 0)va = ins[-ina];else if (ina > 0)va = d[ina].value;if (inb < 0)vb = ins[-inb];else if (inb > 0)vb = d[inb].value;if (kind == 1)value = va & vb;else if (kind == 2)value = va | vb;else if (kind == 3)value = va ^ vb;else if (kind == 4)value = va == 0 ? 1 : 0;if (cas != 0 && (cas - 1) / 3 + 1 == id) {int r = cas % 3;if (r == 0)r = 3;if (r == 1)value = value == 0 ? 1 : 0;else if (r == 2)value = 0;else if (r == 3)value = 1;}update(ins, d, cas);}public void update(int[] ins, Door[] d, int r) {for (int i = 0; i < outcont; i++) {d[out[i]].cont++;if (d[out[i]].cont == d[out[i]].incont) {d[out[i]].cal(ins, d, r);}}}
}
Java实现 蓝桥杯 算法训练 My Bad(暴力)相关推荐
- Java实现 蓝桥杯 算法训练 删除数组零元素
算法训练 删除数组零元素 时间限制:1.0s 内存限制:512.0MB 提交此题 从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移 ...
- Java实现 蓝桥杯 算法训练 Balloons in a Box
试题 算法训练 Balloons in a Box 问题描述 你要写一个程序,使得能够模拟在长方体的盒子里放置球形的气球. 接下来是模拟的方案.假设你已知一个长方体的盒子和一个点集.每一个点代表一个可 ...
- Java实现 蓝桥杯 算法训练 相邻数对(暴力)
试题 算法训练 相邻数对 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给定整数的个数. 第二行包含所给定的n个整数. 输出格式 ...
- Java实现 蓝桥杯 算法训练 Beaver's Calculator
试题 算法训练 Beaver's Calculator 问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator ...
- Java实现 蓝桥杯 算法训练 未名湖边的烦恼
算法训练 未名湖边的烦恼 时间限制:1.0s 内存限制:256.0MB 问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩. ...
- Java实现 蓝桥杯 算法训练 天数计算
试题 算法训练 天数计算 问题描述 编写函数求某年某月某日(**** ** **)是这一年的第几天 .提示:要考虑闰年,闰年的2月是29天(闰年的条件:是4的倍数但不是100的倍数,或者是400的倍数 ...
- Java实现 蓝桥杯 算法训练 Cowboys
试题 算法训练 Cowboys 问题描述 一个间不容发的时刻:n个牛仔站立于一个环中,并且每个牛仔都用左轮手枪指着他旁边的人!每个牛仔指着他顺时针或者逆时针方向上的相邻的人.正如很多西部片那样,在这一 ...
- Java实现蓝桥杯 算法训练 ALGO-15 旅行家的预算
问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...
- Java实现 蓝桥杯 算法训练 字串统计
算法训练 字串统计 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最 ...
最新文章
- vcenter用到java吗_Vijava 学习笔记之 VCenter连接
- 数字货币EOS半年时间暴跌90%多,还可追捧吗?
- Linux 隐藏Windows,如何在windows不用软件隐藏重要文件
- JAVA实现QQ聊天气泡
- 关于Nowpaper
- c++ static 静态变量初始化
- excel流程图分叉 合并_Excel和Visio联姻,自动生成跨职能流程图,还能用图标标记状态,太牛了!...
- javax.naming.NameNotFoundException: QueueConnectionFactory not bound
- 一级标题居中,二级标题固定缩进
- “反悔”贪心 烤鸡翅
- Hexo | yilia主题安装
- 「话题」为什么微信、钉钉撤回消息的时限不同?小米200万改LOGO值不值?
- 什么是“冲激响应”?这样讲你该理解了!
- css怎么随着鼠标移动,利用CSS sprites制作随着鼠标移动的动画背景
- CSDN VIP年卡大放送!中国大数据技术大会超值福利,等你来拿!
- 检查App是否有在后台启动前台服务的行为命令
- /etc/passwd文件详解
- 解决Tomcat启动失败:严重 [main] org.apache.catalina.util.LifecycleBase.handleSubClassException 初始化组件失败
- 杰奇是否生成html,杰奇1.70如何自定义页面
- 【清风数模】 相关系数(理论知识+代码实操 保姆级笔记)
热门文章
- python小项目:MakeCode小游戏——躲砖块
- 微信小程序:爱情保证书制作生成
- 手绘 | 深入解析风控8大场景中的机器学习应用
- [机器学习]---如何用机器学习来判定红楼梦后40回是否曹雪芹所写
- 自动避障小车可视化界面使用说明
- TB6600HG原理图
- 拼接大屏数据展示_大屏数据可视化设计注意事项
- HIGH-DIMENSIONAL CONTINUOUS CONTROL USING GENERALIZED ADVANTAGE ESTIMATION翻译
- 计算机科学的创始人是谁,谁是计算机的父亲(两个)? . 谁是计算机科学的创始人?...
- 太极链——六大技术特点