一、【实验目的】
(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 "stdio.h"
#include <stdlib.h>
#include <time.h>
#define n 17
int X_test(int iA,int iB)
{if(iA==1)return iB;return rand()%2;
}void print_arr(int arr[],int arr_size){ //打印数组 int i;for(i=0;i<arr_size;i++){printf("%d ",arr[i]);}printf("\n");
}int get_chip(int arr[],int start,int arr_size){ //获取没被丢弃的芯片坐标 int i = start % arr_size;while(arr[i] != 1){i++;i = i % arr_size; }return i;
}int get_chips_num(int arr[],int arr_size){ //获取剩余的芯片数 int i;int cnt = 0;for(i = 0;i < arr_size;i++){if(arr[i] == 1){cnt++;}}printf("chips_num = %d\n",cnt);return cnt;
}int main(){int i;int k = n;int chips[n] = {1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0};int chip1;int chip2;int result1;int result2;int a[n];for(i=0;i<n;i++){ //保存芯片丢弃情况,1表示未丢弃 a[i] = 1;}srand(time(NULL));get_chips_num(a,n);chip1 = get_chip(a,0,n);chip2 = get_chip(a,chip1 + 1,n);while(k>3){for(i=0;i<k/2;i++){chip1 = get_chip(a,chip2 + 1,n);chip2 = get_chip(a,chip1 + 1,n);result1 = X_test(chips[chip1],chips[chip2]);result2 = X_test(chips[chip2],chips[chip1]);if(result1 == 1 && result2 == 1){a[chip1] = 0; //设为0表示丢弃 }else{a[chip1] = 0;a[chip2] = 0;}print_arr(a,n);if(get_chips_num(a,n) <= 3) break;}k = get_chips_num(a,n);}if(k = 3){chip1 = get_chip(a,0,n);chip2 = get_chip(a,chip1 + 1,n);result1 = X_test(chips[chip1],chips[chip2]);result2 = X_test(chips[chip2],chips[chip1]);if(result1 == 0 || result2 == 0){a[chip1] = 0;a[chip2] = 0;printf("ans = %d",get_chip(a,0,n)); }else{printf("ans = %d",chip1);} }if(k < 3){chip1 = get_chip(a,0,n);printf("ans = %d",chip1); }return 0;
}
四、实验结果