- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 41286
- 在线时间
- 小时
|
楼主 |
发表于 2009-6-8 09:46:31
|
显示全部楼层
现在写了个程序来简单搜索1000桶酒的解,看看能否找到41个囚徒的解:
不过程序运行挺慢的.-
- #include <vector>
- #define TARGET_COUNT 1000
- #define N 41
- #define WEIGHT 7
- #define MIN_DISTANCE 8
- #define MAX_OVERLAP (WEIGHT-(MIN_DISTANCE+1)/2)
- #define DISP_SIZE ((N+3)/4)
- using namespace std;
- //#define SHOW_COUNT
- vector<long long> data;
- void init()
- {
- long long u=(1LL<<MAX_OVERLAP)-1;
- int j=(N-MAX_OVERLAP)/(WEIGHT-MAX_OVERLAP);
- long long s=(1LL<<(WEIGHT-MAX_OVERLAP))-1;
- int i;
- for(i=0;i<j;i++){
- int k=i*(WEIGHT-MAX_OVERLAP)+MAX_OVERLAP;
- long long r=u|(s<<k);
- data.push_back(r);
- printf("%0*llX",DISP_SIZE,r);
- #ifdef SHOW_COUNT
- printf("::%d",data.size());
- #endif
- printf("\n");
- }
- fflush(stdout);
- }
-
- int bitcount(long long x)
- {
- int bc=0;
- int i;
- for(i=0;i<64;i++){
- if(x&(1LL<<i))bc++;
- }
- return bc;
- }
-
- bool try_next_bit(long long r, int nb, int bc)
- {
- int i,j;
- if(bc>=WEIGHT){
- data.push_back(r);
- printf("%0*llX",DISP_SIZE,r);
- #ifdef SHOW_COUNT
- printf("::%d",data.size());
- #endif
- printf("\n");
- fflush(stdout);
- return true;
- }
- for(i=nb;i<N;i++){
- r|=(1LL<<i);
- for(j=0;j<data.size();j++){
- if(bitcount(r&data[j])>MAX_OVERLAP)
- break;
- }
- if(j<data.size()){
- r&=~(1LL<<i);
- continue;
- }
- if(try_next_bit(r,i+1,bc+1))
- return true;
- r&=~(1LL<<i);
- }
- return false;
- }
-
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- init();
- while(try_next_bit(0LL,0,0));
- printf("Total %d\n",data.size());
- return 0;
- }
复制代码 |
|