位掩码函数
Bitmask functions
我正在编写一个程序,以查找是否可以用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
某个向量时,您将只保留相关位。然后,如果你对位移,你可以判断向量中感兴趣的位是打开还是关闭。
相关文章:
- 位移操作和位掩码未检测到重复字符
- OpenCV - 带有掩码的absdiff
- 生成前缀位掩码
- 如何从__m64值的 lsb 创建 8 位掩码?
- 如何对无符号长 int 进行位掩码?
- 删除K的背景掩码-意味着Python或C++中的集群/
- 如何在C++中优雅地处理位掩码
- 将uint64_t位掩码转换为 std::布尔数组
- 使输入二进制掩码适应 ITK 网格生成器
- 如何从 getifaddr 读取子网掩码
- 优化从子位掩码生成父位掩码
- 基于模式创建位掩码作为 constexpr
- 使用二进制掩码 C++ ITK 获取感兴趣区域
- C++中的运行时位复制(位掩码)
- 根据 IP 和掩码C++打印所有 IP
- 递归函数,用于使用位掩码 c++ 显示集合的所有子集
- 是否有与“ memchr”相似的函数,可以将每个炭与位掩码匹配,而不是确切的平等
- 位掩码函数
- OpenCV 均值函数崩溃,掩码从 OpenCV 阈值函数创建
- 如何在积分类型的模板函数中选择snprinf掩码