正文

导线和开关2005-09-27 10:45:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/elva6401/5393.html

分享到:

#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;
}

阅读(4612) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册