正文

导线和开关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;}

阅读(4862) | 评论(1)


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

评论

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