算法设计课第二周(分治 芯片测试)

本文介绍了如何利用分治策略设计算法,通过最少的测试次数找出一组带有不确定测试结果的芯片中的一片好芯片。实验内容包括理解策略、将伪码转化为代码,并提供了一个具体实现的C++程序作为示例。
摘要由CSDN通过智能技术生成

这玩意真够烧脑的

实验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(好芯片)。如果该芯片轮空并且为好芯片,直接输出结果

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值