试题 算法训练 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);
}
else
System.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(暴力)的更多相关文章

  1. Java实现 蓝桥杯 算法训练 画图(暴力)

    试题 算法训练 画图 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色. 下图给出了一个画了两个矩 ...

  2. Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)

    试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...

  3. Java实现蓝桥杯 算法训练 大等于n的最小完全平方数

    试题 算法训练 大等于n的最小完全平方数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输出大等于n的最小的完全平方数. 若一个数能表示成某个自然数的平方的形式,则称这个数为完全平 ...

  4. java实现 蓝桥杯 算法训练 Password Suspects

    问题描述 在年轻的时候,我们故事中的英雄--国王 Copa--他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好记又难以破解.后来,他才知道这种密码是一个长度为奇数 ...

  5. Java实现 蓝桥杯 算法训练VIP 报数(暴力+数学)约瑟夫环问题

    试题 算法训练 报数 问题描述 现有n个同学站成一圈,顺时针编号1至n.从1号同学开始顺时针1/2报数,报到1的同学留在原地,报到2的同学退出圆圈,直到只剩一名同学为止.问最后剩下的同学编号. 输入格 ...

  6. Java实现蓝桥杯 算法训练 ALGO-15 旅行家的预算

    问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...

  7. Java实现 蓝桥杯 算法训练 审美课

    算法训练 审美课 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 <审美的历程>课上有n位学生,帅老师展示了m幅画,其中有些是梵高的作品,另外的都出自五岁小朋友之手.老师 ...

  8. Java实现 蓝桥杯 算法训练 多阶乘计算

    试题 算法训练 多阶乘计算 问题描述 我们知道,阶乘n!表示n*(n-1)(n-2)-21, 类似的,可以定义多阶乘计算,例如:5!!=531,依次可以有n!..!(k个'!',可以简单表示为n(k) ...

  9. Java实现 蓝桥杯 算法训练 找零钱

    试题 算法训练 找零钱 问题描述 有n个人正在饭堂排队买海北鸡饭.每份海北鸡饭要25元.奇怪的是,每个人手里只有一张钞票(每张钞票的面值为25.50.100元),而且饭堂阿姨一开始没有任何零钱.请问饭 ...

  10. Java实现 蓝桥杯 算法训练 第五次作业:字符串排序

    试题 算法训练 第五次作业:字符串排序 问题描述 输入一个小写字符串,按从小到大的顺序输出. 输入格式 bcaed 输出格式 abcde 顶格输出,中间没有空格 样例输入 一个满足题目要求的输入范例. ...

随机推荐

  1. Day_12【集合】扩展案例3_产生10个长度为10,不能重复,由数字0-9,小写字母和大写字母组成的字符串

    分析以下需求,并用代码实现 1.产生10个1-20之间的随机数要求随机数不能重复 2.产生10个长度为10的不能重复的字符串(里面只能出现大写字母.小写字母.0-9的数字),并遍历打印输出 代码 pa ...

  2. 设计模式之GOF23工厂模式02

    抽象工厂模式 不能添加单个产品,产品族 public interface Seat {  void anmo();}class GoodSeat implements Seat { @Override ...

  3. [java作业]Fan、求直线交点、Triangle2D、选课

    public class Fan { public static void main(String[] args) { Fan fan1 = new Fan(), fan2 = new Fan(); ...

  4. 基于ELK搭建MySQL日志平台的要点和常见错误

    第一部分 概括 ELK是集分布式数据存储.可视化查询和日志解析于一体的日志分析平台.ELK=elasticsearch+Logstash+kibana,三者各司其职,相互配合,共同完成日志的数据处理工 ...

  5. JS理论--正则表达式RegExp的创建、元字符、优先度、方法(test(),exec(),match(),replace())

    实战,参数可以对照上面的,代码一定要敲 var str = 'abc123cba456aaa789'; var reg = /\d+/g; console.log(reg.test(str)) //s ...

  6. search(13)- elastic4s-histograms:聚合直方图

    在聚合的分组统计中我们会面临两种分组元素类型:连续型如时间,自然数等.离散型如地点.产品等.离散型数据本身就代表不同的组别,但连续型数据则需要手工按等长间隔进行切分了.下面是一个按价钱段聚合的例子: ...

  7. vue 自己写组件。

    最近在网上看到很多大神都有写博客的习惯,坚持写博客不但可以为自己的平时的学习做好记录积累 无意之中也学还能帮助到一些其他的朋友所以今天我也注册一个账号记录一下学习的点滴!当然本人能力实在有限写出的文章 ...

  8. react-grid-layout实现拖拽,网格布局

    借鉴地址:https://www.jianshu.com/p/b48858eee3a7 安装 react-grid-layout npm install react-grid-layout impor ...

  9. ql的python学习之路-day12

    前言:这一节主要学习json和pickle 背景: 相信大家在日常生活中都有接触大型的网络游戏,打游戏的时候都是自己在电脑上操作,自己刷怪升级:当然也会碰到中午去吃饭然后挂机的情况,让电脑自动的刷怪, ...

  10. 读懂操作系统(x64)之堆栈帧(过程调用)

    前言 上一节内容我们对在32位操作系统下堆栈帧进行了详细的分析,本节我们继续来看看在64位操作系统下对于过程调用在处理机制上是否会有所不同呢? 堆栈帧 我们给出如下示例代码方便对照汇编代码看,和上一节 ...