芯片测试
解题思路
- 从测试结果矩阵,推导芯片好坏
- 因为存在坏芯片测试结果的不确定性,故不可行
- 从芯片好坏推导,测试矩阵
- 我们可以假设一个可行解,即
- 用其中好芯片的测试结果,去对比测试结果矩阵
- 如果对应好芯片测试位结果一致,则证明,我们假设的可行解,是正确的
- 这里只能通过我们,假设解中的,好芯片去判断,比对,坏芯片是不具有推断价值,因为其存在不确定性
遇到的一些问题
- 还有老毛病,忽略了,题目给的非常重要的一个条件
- 好的芯片比坏的芯片多,emmm,如果没有这一限制的话,你会发现
- 题目所给出的测试用例,当二号芯片好时,也是满足条件的
- 说多都是泪
- 还有第二个问题,就是在定义数组长度的,时候,在第一次做demo时,将其写死了,写成了3
- 后面提交代码时,也没有改。导致浪费了很多时间
- 切忌粗心大意啊啊啊啊啊啊啊
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[][] a = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
a[i][j] = scanner.nextInt();
}
}
// 得到所有 有可能解的个数
int k = (int) Math.pow(2, n);
here:
// 遍历每个解
for (int i = 1;i < k; i++) {
// 得到可能解的 正确格式 ,即为int 数组
String binaryString = Integer.toBinaryString(i);
for (int j = 0; binaryString.length()<n; j++) {
binaryString = "0".concat(binaryString);
}
char[] charArray = binaryString.toCharArray();
int[] c = new int[charArray.length];
for (int j = 0; j < c.length; j++) {
c[j] = charArray[j]-48;
}
// 排除不可行解,即坏芯片比好芯片多
if (!isOk(c)) {
continue here;
}
/**
* 遍历此解
* 当遇到好芯片时,用其去测试,其余芯片,得到测试结果,
* 再对比传入的测试矩阵, 有不同,则表示,此解错误,
* 则求下个一个解
*/
for (int j = 0; j < c.length; j++) {
// 得到好芯片
if (c[j]==1) {
for (int j2 = 0; j2 < c.length; j2++) {
// 当被测试芯片为坏芯片时
if (c[j2]==0) {
// 矩阵中的测试结果,缺不为坏芯片时,则证明此解不通,跳过此解
if (a[j][j2]!=0) {
continue here;
}
}else {
if (a[j][j2]!=1) {
continue here;
}
}
}
}
}
show(c);
return;
}
}
/**
* 判断 1 的个数是否大于 0的个数
*/
public static boolean isOk(int[] a) {
int sum = 0;
for (int i = 0; i < a.length; i++) {
sum+=a[i];
}
return sum>a.length/2;
}
/**
* 格式化输出结果
*/
public static void show(int[] a){
for (int i = 0; i < a.length; i++) {
if (a[i]==1) {
System.out.print(i+1+" ");
}
}
}
}
其他的题,也都有整理,可以看我的博客 断然不然嘞?