試題四[clrs上的裝配調度,經典dp題]
/*
<1>f[0][0]=e[0]+a[0][0] f[1][0]=e[1]+a[1][0]
<2>f[0][j-1]+a[0][j]
<3>f[1][j-1]+a[1][j]<f[0][j-1]+t[0][j-1]+a[1][j]
<4>fi=f[0][n-1]+x[0]  li=0
<5>fi=f[1][n-1]+x[1]  li=1

    (1) e0 和 e1 表示底盤分別進入裝配線 0 和裝配線 1 所需要的時間。
  (2) 每條裝配線有 n 個工位,第一條裝配線的工位為 S0,0, S0,1, …, S0,n-1, 第二條裝 配線的工位為 S1,0, S1,1, …, S1,n-1。其中 S0,k 和 S1,k(0≤k≤n-1)完成相同的任務,但所需時間可能不同。
  (3) ai,j 表示在工位 Si,j 處的裝配時間,其中 i 表示裝配線(i=0 或 i=1),j 表示工位號(0≤j≤n-1)。
  (4) ti,j 表示從 Si,j 處裝配完成后轉移到另一條裝配線下一個工位的時間。
  (5) x0 和 x1 表示裝配結束后,汽車分別從裝配線 0 和裝配線 1 下線所需要的時間。
  (6) 在同一條裝配線上,底盤從一個工位轉移到其下一個工位的時間可以忽略不計。
  該算法的輸入為:
   n: 表示裝配線上的工位數;
   e[i]: 表示 e1 和 e2,i 取值為 0 或 1;
   a[i][j]:表示 ai,j,i 的取值為 0 或 1,j 的取值范圍為 0~n-1;
   t[i][j]:表示 ti,j, i 的取值為 0 或 1,j 的取值范圍為 0~n-1;
   x[i]: 表示 x0 和 x1,i 取值為 0 或 1。
  算法的輸出為:
   fi:最短的裝配時間;
   li:獲得最短裝配時間的下線裝配線號(0 或者 1)。
  算法中使用的 f[i][j]表示從開始點到 Si,j 處的最短裝配時間。
*/

void Dp(){
 f[
0][0]=e[0]+a[0][0];
 f[
1][0]=e[1]+a[1][0];
 
for(int j=1;j<n;++j)
 
{
  
if(f[0][j-1]+a[0][j]<f[1][j-1]+a[0][j]+t[1][j-1])
   f[
0][j]=f[0][j-1]+a[0][j];
  
else
   f[
0][j]=f[1][j-1]+a[0][j]+t[1][j-1];
  
if(f[1][j-1]+a[1][j]<f[0][j-1]+t[0][j-1]+a[1][j])
   f[
1][j]=f[1][j-1]+a[1][j];
  
else
   f[
1][j]=f[0][j-1]+t[0][j-1]+a[1][j];
 }

 
if(f[0][n-1]+x[0]<=f[1][n-1]+x[1])
  fi
=f[0][n-1]+x[0],li=0;
 
else
  fi
=f[1][n-1]+x[1],li=1;
}


試題五[BFS,數據結構題]
函數 LevelTraverse()的功能是對給定樹進行層序遍歷。例如,對圖 5-1 所示的樹進 行層序遍歷時,結點的訪問次序為:D B A E F P C 。
對樹進行層序遍歷時使用了隊列結構,實現隊列基本操作的函數原型如下表所示:

函數原型
 說明
 
void InitQueue(Queue *Q)
 初始化隊列
 
Bool IsEmpty(Queue Q)
 判斷隊列是否為空,若是則返回 TRUE,否則返回 FALSE
 
void EnQueue(Queue *Q,TreeNode p)
 元素入隊列
 
void DeQueue(Queue *Q,TreeNode *p)
 元素出隊列
 

  Bool、Status 類型定義如下:
   typedef enum {FALSE = 0,TRUE = 1} Bool;
   typedef enum {OVERFLOW = -2,UNDERFLOW = -1,ERROR = 0,OK = 1} Status;

  樹的二叉鏈表結點定義如下:
   typedef struct Node {
    char data;
    struct Node *firstchild,*nextbrother;
   }Node,*TreeNode;

[函數]
  Status LevelTraverse(TreeNode root)
  
{ /*層序遍歷樹,樹采用孩子-兄弟表示法,root 是樹根結點的指針*/
   Queue tempQ;
   TreeNode ptr,brotherptr;
   
if (!root)
    
return ERROR;
   InitQueue(
&tempQ);
    (
1) ;   //(1) EnQueue(&tempQ,root)    
   brotherptr = root -> nextbrother;
   
while (brotherptr){ EnQueue(&tempQ,brotherptr);
     (
2) ; //(2)brotherptr = brotherptr -> nextbrother
   }
 /*end-while*/
   
while ( (3) ) {   // (3)!IsEmpty(&tempQ)
     (4) ;          // (4)DeQueue(&tempQ,ptr)  
    printf("%c\t",ptr->data);
    
if ( (5) ) continue//(5)!ptr->firstchild
     (6) ; //(6)EnQueue(&tempQ,ptr->firstchild)
    brotherptr = ptr->firstchild->nextbrother;
    
while (brotherptr){ EnQueue(&tempQ,brotherptr);
      (
7) ;//(7)brotherptr = brotherptr -> nextbrother
    }
 /*end-while*/
   }
 /*end-while*/
   
return OK;
  }
/*LevelTraverse*/

// 這題開始看題就看錯了,以為是2叉樹,想了半天,回頭一看題,樹的層次遍歷..!orz..


試題六[考C++派生,繼承]

[C++代碼 1]
  
const int CLOSED = 1const int OPENING = 2;
  
const int OPEN = 3const int CLOSING = 4;
  
const int STAYOPEN = 5//定義狀態變量,用不同整數表示不同狀態

  
class Door {
  
private:
   
int state; //傳輸門當前狀態
   void setState(int state)this->state = state; } //設置當前狀態
  public:
   Door():state(CLOSED)
{};
   
void getState(){ //根據當前狀態輸出相應的字符串
    switch(state){
     
case OPENING: cout <<"OPENING" << endl; break;
     
case CLOSED: cout << "CLOSED" << endl; break;
     
case OPEN: cout << "OPEN" << endl; break;
     
case CLOSING: cout << "CLOSING" << endl; break;
     
case STAYOPEN: cout << "STAYOPEN" << endl; break;
    }

   }

   
void click() { //發生click事件時進行狀態轉換
    if ( (1) ) setState(OPENING);  //(1)state==CLOSED||state==CLOSING
    else if ( (2) ) setState(CLOSING); //(2)state==STAYOPEN||state==OPENING
    else if ( (3) ) setState(STAYOPEN);//(3)state==OPEN
   }

   
void timeout(){ //發生timeout事件時進行狀態轉換
    if (state == OPEN) setState(CLOSING);
   }

   
void complete(){ //發生complete事件時進行狀態轉換
    if (state == OPENING) setState(OPEN);
    
else if (state == CLOSING) setState(CLOSED);
   }

  }
;
  
int main(){
   Door aDoor;
   aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.complete();
   aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.click();
   aDoor.getState(); 
return 0;
  }


[C
++代碼 2]
  
class Door {
  
public:
   DoorState 
*CLOSED, *OPENING, *OPEN, *CLOSING, *STAYOPEN, *state;
   Door();
   
virtual ~Door(){ ……  //釋放申請的內存,此處代碼省略};
   void setState(DoorState *state) this->state = state; }
   
void getState(){
    
// 此處代碼省略,本方法輸出狀態字符串,
    
// 例如,當前狀態為CLOSED時,輸出字符串為“CLOSED”
   }
;
   
void click();
   
void timeout();
   
void complete();
  }
;


  Door::Door()
{
   CLOSED 
= new DoorClosed(this);    OPENING = new DoorOpening(this);
   OPEN 
= new DoorOpen(this);      CLOSING = new DoorClosing(this);
   STAYOPEN 
= new DoorStayOpen(this);  state = CLOSED;
  }

  
void Door::click(){ (4) ;}       //(4)state->click()
  void Door::timeout(){ (5) ; }    //(5)state->timeout()
  void Door::complete(){ (6) ; }   //(6)state->complete()

  
class DoorState //定義一個抽象的狀態,它是所有狀態類的基類
  {
  
protected: Door *door;
  
public:
   DoorState(Door 
*door) this->door = door; }
   
virtual ~DoorState(void);
   
virtual void click() {}
   
virtual void complete() {}
   
virtual void timeout() {}
  }
;

  
class DoorClosed :public DoorState{ //定義一個基本的 Closed 狀態
  public:
   DoorClosed(Door 
*door):DoorState(door) {}
   
virtual ~ DoorClosed (){}
   
void click();
  }
;
  
void DoorClosed::click() { (7) ; } //(7)door->setState(door->OPENING)
  
// 其它狀態類的定義與實現代碼省略

  
int main(){
   Door aDoor;
   aDoor.getState(); aDoor.click();  aDoor.getState(); aDoor.complete();
   aDoor.getState(); aDoor.timeout(); aDoor.getState(); 
return 0;
  }


//派生,繼承,方面的東西幾乎忘干凈了