宝宝,文章都被你看光了,可以给我一个赞吗?拜托拜托❤️
或者点个关注也行谢谢宝宝💕
这玩意真够烧脑的
实验2 芯片测试算法设计
一、【实验目的】
(1)理解分治策略的设计思想;
(2)熟悉将伪码转换为可运行的程序的方法;
(3)能够根据算法的要求设计具体的实例。
二、【实验内容】
有n片芯片,其中好芯片比坏芯片至少多1片,现需要通过测试从中找出1片好芯片。测试方法是:将2片芯片放到测试台上,2片芯片互相测试并报告测试结果:“好”或者“坏”。假设好芯片的报告是正确的,坏芯片的报告是不可靠的。请设计一个算法,使用最少的测试次数来找出1片好芯片。
提示:可参考教材P29页的算法2.3. 测试函数可以采用以下方法。
#include "stdio.h"
#include <stdlib.h>
#include <time.h>
//建立测试函数,参数iA表示主动测试芯片, iB表示被测芯片.返回值为被测芯片的测试值
//值为1时表示好芯片,为0时表示坏芯片.
//应用随机数来表示不确定的值1、0.注意:在主函数中加上随机数种子语句srand(time(NULL));
//算法的输入可以用数组表示,比如:ABc[17]={1,0,0,1,1,1,0,0,1,1,1,1,0,1,0,0,0} 表示17个芯片,其中9片好芯片、8片坏芯片。
int X_test(int iA,int iB)
{
if(iA==1)
return iB;
return rand()%2;
}
三、实验源代码
#include <iostream>
using namespace std;
#include <time.h>
#include <queue>
//17个芯片
int input[] = {-1, 1,0,0,1,1,1,0,0,1,1,1,1,0,1,0,0,1}; // 输入数组,表示每个芯片的质量
// X_test函数用于测试两个芯片之间的连接情况
int X_test(int iA, int iB)
{
if(iA == 1)
return iB;
return rand()%2; // 随机返回0或1
}
// testOneChip函数用于测试一个芯片与其他芯片的连接情况
int testOneChip(int chip, int n)
{
int count;
for(int i=1; i<=n; i++)
{
count += X_test(input[chip], input[i]);
}
if(count > (n-1)/2) // 奇数,至少有(n-1)/2个报"好"
return true;
else //否则报"坏"
return false;
}
// main函数是程序的入口点
int main()
{
srand(time(NULL)); // 设置随机数种子
int n = 17; // 芯片数量
int k = n; // 当前待测试的芯片数量
queue<int> q; // 使用队列存储待测试的芯片下标
for(int i=1; i<=n; i++)
q.push(i); // 将芯片下标入队
while(k > 3)
{
for(int i=1; i<= k/2; i++)
{
int chipIndex1 = q.front(); // 取出队列头部的芯片下标
q.pop();
int chipIndex2 = q.front(); // 取出队列头部的芯片下标
q.pop();
int test1 = X_test(input[chipIndex1], input[chipIndex2]); // 测试两个芯片之间的连接情况
int test2 = X_test(input[chipIndex2], input[chipIndex1]); // 测试两个芯片之间的连接情况
if(test1 == test2 && test2 == 1) // 如果两个芯片都连接良好,则任取一片留下
{
q.push(chipIndex2);
}
else
{
; // 丢弃
}
}
if(k % 2 == 1) // 如果剩余芯片数量为奇数,则对最后一片芯片进行单独测试
{
int chipIndex1 = q.front();
q.pop();
//暴力算法,与全部芯片测一遍
if(testOneChip(chipIndex1, n) == true) // 如果该芯片与其他芯片连接良好,则输出结果
{
cout << chipIndex1 << endl;
return 0; //程序结束
}
}
k = q.size(); // 更新当前待测试的芯片数量
}
int chipIndex1 = q.front(); // 取出队列头部的芯片下标
q.pop();
int chipIndex2 = q.front(); // 取出队列头部的芯片下标
q.pop();
if(k == 3) // 如果剩余芯片数量为3,则进行最后一次测试
{
int test1 = X_test(input[chipIndex1], input[chipIndex2]); // 测试两个芯片之间的连接情况
int test2 = X_test(input[chipIndex2], input[chipIndex1]); // 测试两个芯片之间的连接情况
if(test1 || test2) // 如果至少有一个芯片连接良好,则输出该芯片的下标
{
cout << q.front() << endl;
return 0;
}
}
if(k == 2 || k == 1) // 如果剩余芯片数量为2或1,则直接输出其中一个芯片的下标
{
cout << chipIndex1 << endl;
return 0;
}
}
四、实验结果
第12片是好芯片
测试轮空情况的蛮力算法, 因为有17个芯片,把最后一个芯片设为1(好芯片)。如果该芯片轮空并且为好芯片,直接输出结果