MyException - 我的异常网
当前位置:我的异常网» C++ » 状态枚举种Enumerator源代码,欢迎拍砖

状态枚举种Enumerator源代码,欢迎拍砖(2)

www.MyException.Cn  网友分享于:2013-02-21  浏览:3次

if(i >= SIZE) throw std::out_of_range(std::string("i should less than ") + boost::lexical_cast<std::string>(SIZE));
return (status[i / BITS] >> (i % BITS)) & 1;
}
void set(size_t i , bool s)
{
if(s)
status[i / BITS] |= 1 << (i % BITS);
else
status[i / BITS] &= ~(1 <<( i % BITS));
}
size_t count(bool s) const
{
unsigned result = 0;
for (auto p : status)
{
while(p)
{
result += p & 1;
p >>= 1;
}
}

return s ? result : SIZE - result;
}
size_t size() const
{
return SIZE;
}
protected:
private:
static const auto BITS = std::numeric_limits<TYPE>::digits;
const size_t SIZE;
std::vector<TYPE> status;
};


然后可以用如下代码来解上面的问题:


#include "Enumerator.h"
#include <iostream>
using std::cout;
using std::endl;
bool Check(const Enumerator<2>& e)
{
assert(e.size() == 5);
const int A = 0;
const int B = 1;
const int C = 2;
const int D = 3;
const int E = 4;
//如果A参加,则B一定参加
if(e.get(A) && !e.get(B))
return false;
//C和D有且只有一人参加
if(e.get(C) == e.get(D)) return false;
//D和E状态一致
if(!(e.get(D) == e.get(E))) return false;
//如果C参加,则B不参加
if(e.get(C) && e.get(B)) return false;
//最多有两个人参加
if(e.count(true) > 2) return false;

return true;

}
int _tmain(int argc, _TCHAR* argv[])
{
Enumerator<2> d(5,0);

do
{
if(Check(d))
{
for (int i = 0 ; i <d.size() ; ++i)
{
cout<<(short)d.get(i);
}

cout<<endl;
}
} while (d++);

system("pause");
return 0;
}



enumerator 枚举器

------解决方案--------------------
引用:
是不是大家都不喜欢看这么长的代码?

代码不是一瞬间就能看完的啊。。。楼主难道在线等评价?

------解决方案--------------------
利用二进制压缩状态,对1~2^6-1之间的值逐个判断也不失为一个可行办法。
------解决方案--------------------
引用:
引用:
利用二进制压缩状态,对1~2^6-1之间的值逐个判断也不失为一个可行办法。

为什么是6次方?

其实我没明白你说的啥意思……

#include<cstdio>
using namespace std;

int pow(int a)
{
    if(a==0)return 1;
    else return 2*pow(a-1);
}

void HaveFun()
{
    for(int i=0;i<=pow(6)-1;i++)
        if(i&0x10?(i&0x8?1:0):1)

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有