芯片测试

蓝桥杯基础练习:芯片测试

问题描述
  有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。
  每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。
  给出所有芯片的测试结果,问哪些芯片是好芯片。
输入格式
  输入数据第一行为一个整数n,表示芯片个数。
  第二行到第n+1行为n*n的一张表,每行n个数据。表中的每个数据为0或1,在这n行中的第i行第j列(1≤i, j≤n)的数据表示用第i块芯片测试第j块芯片时得到的测试结果,1表示好,0表示坏,i=j时一律为1(并不表示该芯片对本身的测试结果。芯片不能对本身进行测试)。
输出格式
  按从小到大的顺序输出所有好芯片的编号
样例输入
3
1 0 1
0 1 0
1 0 1
样例输出
1 3
 
思路:我们先假设第一行是正确的,那么第一行所得到的结果就是整个的芯片好坏的情况。
正确的条件:
(1)有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。--->得出好的芯片good > n/2。
(2)因为我们是假设某一行是正确的,那么要想到如何确定他是否正确的。所以找到了一个矛盾条件,如果该芯片a是好的,它认为芯片b也是好的,但是b芯片认为a是坏的。意味着当前假设不成立,需要换另一行。 
 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     public static void main(String args[]){
 5         Scanner sc = new Scanner(System.in);
 6         int n = sc.nextInt();
 7         int[][] array = new int[n][n];
 8         for(int i=0;i<n;i++){
 9             for(int j=0;j<n;j++){
10                 array[i][j] = sc.nextInt();
11             }
12         }
13         int good=0,bad=0;
14         boolean book = true;
15         for(int i=0;i<n;i++){
16             for(int j=0;j<n;j++){
17                 if(array[i][j]==1){
18                     if(array[j][i]==1)
19                         good++;
20                     else {
21                         book = false;
22                         break;
23                     }
24                 }else{
25                     bad++;
26                 }
27             }
28             if(book){
29                 if(good > n/2){
30                     for(int j=0;j<n;j++){
31                         if(array[i][j] == 1){
32                             System.out.print(j+1+" ");
33                         }
34                     }
35                     break;
36                 }
37             }
38         }
39     }
40 
41 }
原文地址:https://www.cnblogs.com/AIchangetheworld/p/12515649.html