位掩码函数

Bitmask functions

本文关键字:函数 掩码      更新时间:2023-10-16

我正在编写一个程序,以查找是否可以用N根长度的N根棍子制作一个正方形。 我使用了位掩码,因为对于我将要放入的大输入来说更容易。 出于某种原因,我的回溯代码没有返回任何内容,在这一行"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("yesn");
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("%dn",&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("non");
else{
bitmask=0;
maximo=suma/4;
analiza(0,0);
}

}

return 0;
}

您似乎从未初始化过位掩码。如果位掩码恰好为 0,那么您将永远不会进入循环。这似乎是问题的一部分。
此外,(bitmask & (1 << i)也可以简化为"0",因为位掩码为 0,并且您使用的是按位and。因此,可以消除整个if条件,因为它将始终计算为 true。
此外,看起来您没有以正确的方式使用位掩码。您希望位掩码至少有一个位等于 1,因为当您使用位掩码and某个向量时,您将只保留相关位。然后,如果你对位移,你可以判断向量中感兴趣的位是打开还是关闭。