2015-04-27 26 views
0

我有這樣一段代碼:翻了環插入一個遞歸

for (int i=0; i<N; i++) 
{ 
    int j; 
    if (i%2==1) j=1; 
    else j=0; 
    for (; j<N; j+=2) 
    { 
     for(int k=0; k<N; k++) 
     { 
      int n; 
      if (k%2==1) n=1; 
      else n=0; 
      for (; n<N; n+=2) 
      { 

       for (int l=0; l<N; l++) 
       { 
        int o; 
        if (l%2==1) o=1; 
        else o=0; 
        for (; o<N; o+=2) 
        { 

         for(int m=0; m<N; m++) 
         { 
          int p; 
          if (m%2==1) p=1; 
          else p=0; 
          for (; p<N; p+=2) 
          { 

           if (check_full(lenta,i,j,k,n,l,o,m,p)) 
           { 
            count++; 
            cout<<"Lenta uzsipilde: ("<<i<<","<<j<<"), "<<"("<<k<<","<<n<<"), "<<"("<<l<<","<<o<<"), "<<"("<<m<<","<<p<<"), "<<endl; 
           } 

          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

有沒有什麼辦法可以變成遞歸?基本上這些循環爲給定的問題找到了所有可能的座標。如果它可以轉換成一個小的遞歸,我需要使用數組而不是8個變量?

這裏就是我試圖這樣做,但它不工作:

void findBishops(){ 
    for (int i=0; i<N; i++){ 
     int j; 
     if (i%2==1) j=1; 
     for (; j<N; j+=2){ 
      putIntoArray(array, i, j); 
      if (isFull(board, array)){ 
       PrintAnswer(array); 
      }else{ 
       arrayCount = arrayCount-2; 
       findBishops(); 
      } 
      } 
    } 
    } 
void putIntoArray(array[], i, j){ 
    array[arrayCount++] = i; 
    array[arrayCount++] = j; 
} 
+0

你需要一個其他的if(i%2 == 1)j == 1;在findBishops中。 –

+0

哦,對,謝謝!但這不是問題。在我看來,整個功能寫得很糟糕,我很幸運修復它。 –

+2

你能簡單介紹一下你的任務嗎?你在你的問題中所說的話不清楚。 –

回答

0

我可能會改乘了主教,而不是遍歷所有的板:

第一名一位主教,然後遞歸放置第二個,等等,直到達到最後。
當你從遞歸返回時會發生回溯,那就是當你嘗試下一個替代方案時,對於單個主教,然後再次遞歸。
直到你用完選項 - 那就是當你完成。

這裏有一個大致的輪廓:

place_bishop(this_bishop) 
    if this_bishop is the final bishop: 
     for every possible position of this_bishop: 
      see if it's a solution and handle that 
    else: 
     for every possible position of this_bishop: 
      place_bishop(next_bishop) 

位置採摘需要一些思考,爲了不找到相同的解決方案不止一次。