#include <iostream.h>int M; //导线条数int *link; //link[i]为连接导线i的开关序号 //判断集合p1中的元素是否全为零,若全为零,则返回true;反之,返回false;bool empty(int p1[]) { int i; bool falg=true; for(i=0;i<M;i++) if(p1[i]!=0) { falg=false; break; } return falg;}//判断导线和开关之间的连接,其中开关左区间的起始下标为head,终止下标为tail;区间开关状态为state:0表示断开,1表示闭合.void check(int *p1,int head,int tail,int state){ int *p2=new int [M]; int i,j; char ch; if(!empty(p1)) { if(head==tail) //如果左区间只剩下一个开关,则将p1中所有导线与这个开关连接 { for(i=0;i<M;i++) if(p1[i]!=0) link[i]=head+1; } else { i=(int)((head+tail+1)/2); for(j=head;j<i;j++) { //进行人机问答 cout<<"C"<<j+1<<endl; cin>>ch; } for(j=0;j<M;j++) //p2设空 p2[j]=0; for(j=0;j<M;j++) if(p1[j]!=0) //导线j+1在p1中 { //进行人机问答 cout<<"T"<<j+1<<endl; cin>>ch; if((state==0&&ch=='N')||(state==1&&ch=='Y')) { //若灯灭而左区间卡关闭合或者灯亮而左区间开关断开,则将导线j+1从p1集合中移到p2集合中 p1[j]=0; p2[j]=j+1; } } check(p1,head,i-1,1-state); //完成p1集合中的导线与左区间开关的连接 check(p2,i,tail,state); //完成p2集合中的导线与右区间开关的连接 } } delete [] p2;}//输出连接方案void show(){ int i; cout<<"D"; for(i=0;i<M;i++) cout<<" "<<link[i]; cout<<endl;}//主程序int main(){ while(cin>>M) { int i; link=new int [M]; int *p1=new int [M]; for(i=0;i<M;i++) //所有导线进入p1集合 p1[i]=i+1; check(p1,0,M-1,0); //完成导线与开关的连接 show(); delete [] p1; delete [] link; } return 0;}

评论