我正在编写一个程序来查找是否可以制作N长N长的正方形。 我已经使用了Bitmask,因为我会把更大的输入放在那里。由于某种原因,我的回溯代码没有返回任何东西,在这行“bitmask&(1<<< vec [i])”它永远不会进入。 如果我使用错误的功能,有人可以帮助我吗?我最近学到了这个,但我找不到信息。
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;
}
答案 0 :(得分:1)
您似乎没有初始化位掩码。如果位掩码恰好为0,那么您将永远不会进入循环。这似乎是问题的一部分
此外,(bitmask & (1 << i)
可以简化为“0”,因为位掩码为0并且您正在使用按位和。因此,整个if条件可以被消除,因为它总是评估为真
此外,它看起来并不像您正确使用位掩码。您希望位掩码至少有一个位等于1。这样当你和一些带位掩码的向量时,你只会保留相关的位。然后,如果你移位,你可以判断向量中的有趣位是打开还是关闭。