2012-10-23 80 views
0

我正在寫一個程序找到,如果我可以用N長度爲N支一個正方形。 我已經使用Bitmask使它更容易輸入大量的內容。出於某種原因,我回溯它的代碼不返回任何東西,在這條線「位掩碼&(1 < < VEC [1])」它永遠不會去。如果使用了錯誤的功能IM 有人能幫助我嗎?我最近了解到這一點,但我找不到信息。位掩碼功能

PD:我不是說英語的人,對不起我的語法和句法問題。

感謝

// 10364 - Square.cpp: archivo de proyecto principal. 
#include "stdafx.h" 
#include <stdio.h> 
#include <vector> 

using namespace std; 

vector<int> vec; 
int bitmask,casos,palitos,suma,maximo; 
bool analiza(int analizado,int lados)// lados =cantidad lados analizados, contador 
{ 
    if (analizado==maximo) 
    { 
     analizado=0; 
     lados++; 
    } 
    if(lados==4) 
    { 
     printf("yes\n"); 
     return true; 
    } 

     for (int i=0;i<palitos;i++) 
     { 
      if (!(bitmask & (1 << i))) 
      { 
       if (analizado+vec[i]<=maximo) 
       { 
        bitmask | (1 << i); 
        if(analiza(analizado+1,lados)) 
         return true; 
        bitmask & ~(1 << i); 

       } 
      } 

     } 
     return false; 
     //prender: bitmask | (1 << indice) 
     //apagar: bitmask & ~(1 << indice) 
     /*comparar: bitmask & (1 << indice)*/ 
} 
int main() 
{ 
    freopen("in.txt","rt",stdin); 
    freopen("out.txt","wt",stdout); 

    scanf("%d\n",&casos); 
    for(int i=0;i<casos;i++) 
    { 
     scanf("%d",&palitos); 
     vec.clear(); 
     vec.resize(palitos); 
     suma=0; 
     for(int j=0;j<palitos;j++) 
     { 
      scanf("%d",&vec[j]); 
      suma+=vec[j]; 
     } 
     if(suma%4!=0) 
      printf("no\n"); 
     else{ 
      bitmask=0; 
      maximo=suma/4; 
      analiza(0,0); 
      } 


    } 


    return 0; 
} 

回答

1

它似乎並不像你曾經初始化位掩碼。如果掩碼恰好爲0,那麼你將永遠不會進入循環。這似乎是問題的一部分。
(bitmask & (1 << i)可以被簡化爲「0」,因爲位掩碼爲0,並且使用的是按位和。因此,如果條件可以被消除,那麼它總會被評估爲真。
此外,它看起來並不像正在使用正確方式的位掩碼。你想要一個位掩碼至少有一個位等於1。這樣,當你和某些向量與位掩碼相關時,你只會保留相關位。然後,如果你移位,你可以知道矢量中的有趣位是開還是關。

+0

但funtions都OK分辯? – Giuseppe

+0

由於某種原因,在這行if(!(bitmask&(1 << vec [i])))),它繼續進行,並ive關閉位掩模,然後我使用遞歸函數,idk爲什麼我不能關閉它。 – Giuseppe

+0

但是,掩碼爲0,它的初始化,它應該擁有所有的旗幟在零值 – Giuseppe