蓝桥杯-基础训练-芯片测试

芯片测试

在这里插入图片描述

解题思路

  • 从测试结果矩阵,推导芯片好坏
    • 因为存在坏芯片测试结果的不确定性,故不可行
  • 从芯片好坏推导,测试矩阵
    • 我们可以假设一个可行解,即
    • 用其中好芯片的测试结果,去对比测试结果矩阵
    • 如果对应好芯片测试位结果一致,则证明,我们假设的可行解,是正确的
    • 这里只能通过我们,假设解中的,好芯片去判断,比对,坏芯片是不具有推断价值,因为其存在不确定性

遇到的一些问题

  • 还有老毛病,忽略了,题目给的非常重要的一个条件
    • 好的芯片比坏的芯片多,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+" ");
			}
		}
	}
	
}

其他的题,也都有整理,可以看我的博客 断然不然嘞?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值