一、【实验目的】
(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;
}
四、实验结果