2012-10-23 79 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