| 
注册时间2007-12-27最后登录1970-1-1威望 星金币 枚贡献 分经验 点鲜花 朵魅力 点上传 次下载 次积分48888在线时间 小时 
 | 
 
 楼主|
发表于 2008-10-5 17:39:26
|
显示全部楼层 
| 下面程序你可以运行一下看,Windows下面运行 复制代码
#include "stdafx.h"
#define N 12
#include <set>
using namespace std;
bool has_set(int x[],int size)
{
    int mask=0;
    int i;
    char fName[20];
    for(i=0;i<size;i++){
        mask|=1<<(x[i]-1);
    }
    sprintf(fName,"data\\%d",mask);
    FILE *pFile=fopen(fName,"rb");
    if(pFile==NULL)
        return false;
    fclose(pFile);
    return true;
}
#define BUFF_LEN 4096
int buff[BUFF_LEN];
int buff2[BUFF_LEN];
void output_r(int i)
{
    int s=(1<<i)-1;
    char fName[20];
    sprintf(fName,"data\\%d",s);
    FILE *pFile=fopen(fName,"rb");
    if(pFile==NULL){
        fprintf(stderr,"Cannot read file %s\n",fName);
        exit(-1);
    }
    int yu=fread(buff,sizeof(int),BUFF_LEN,pFile);
    int x=1,start;
    if(buff[0]==0)start=1;else start=0;
    while(buff[start]==x){
        x++;
        start++;
        if(start>=yu){
            if(yu==BUFF_LEN){
                yu=fread(buff,sizeof(int),BUFF_LEN,pFile);
                start=0;
                if(yu==0)break;
            }else break;
        }
    }
    printf("r[%d]=%d\n",i,x);
    fclose(pFile);
}
void save_set(const set<int>& result, int x[],int size)
{
    int mask=0;
    int i;
    char fName[20];
    for(i=0;i<size;i++){
        mask|=1<<(x[i]-1);
    }
    sprintf(fName,"data\\%d",mask);
    FILE *pFile=fopen(fName,"wb");
    if(pFile==NULL){
        fprintf(stderr,"Cannot write file %s\n",fName);
        exit(-1);
    }
    int j;
    set<int>::const_iterator cit;
    i=j=0;
    for(cit=result.begin();cit!=result.end();++cit){
        buff[j++]=*cit;
        i++;
        if(j==BUFF_LEN){
            j=0;
            fwrite(buff,sizeof(int),BUFF_LEN,pFile);
        }
    }
    if(j>0){
        fwrite(buff,sizeof(int),j,pFile);
    }
    fclose(pFile);
    if((mask&(mask+1))==0){
        output_r(size);
    }
}
void add_result(set<int>& result, int y[],int yc,int z[],int zc)
{
    int mask=0;
    int i,j;
    char fName[20];
    FILE *yFile,*zFile;
    int yu,zu;
    if(yc<=2){
        if(yc==1){
            yu=1;
            buff[0]=y[0];
        }else{
            yu=3;
            buff[0]=y[0]+y[1];
            buff[1]=abs(y[0]-y[1]);
            buff[2]=y[0]*y[1];
        }
        yFile=NULL;
    }else{
        mask=0;
        for(i=0;i<yc;i++){
            mask|=1<<(y[i]-1);
        }
        sprintf(fName,"data\\%d",mask);
        yFile=fopen(fName,"rb");
        if(yFile==NULL){
            fprintf(stderr,"Cannot read file %s\n",fName);
            exit(-1);
        }
        yu=fread(buff,sizeof(int),BUFF_LEN,yFile);
    }
    if(zc<=2){
        if(zc==1){
            zu=1;
            buff2[0]=z[0];
        }else{
            zu=3;
            buff2[0]=z[0]+z[1];
            buff2[1]=abs(z[0]-z[1]);
            buff2[2]=z[0]*z[1];
        }
        zFile=NULL;
    }else{
        mask=0;
        for(i=0;i<zc;i++){
            mask|=1<<(z[i]-1);
        }
        sprintf(fName,"data\\%d",mask);
        zFile=fopen(fName,"rb");
        if(zFile==NULL){
            fprintf(stderr,"Cannot read file %s\n",fName);
            exit(-1);
        }
        zu=fread(buff2,sizeof(int),BUFF_LEN,zFile);
    }
    if(zu<BUFF_LEN){
        do{
            for(i=0;i<zu;i++)for(j=0;j<yu;j++){
                result.insert(buff2[i]+buff[j]);
                result.insert(buff2[i]*buff[j]);
                result.insert(abs(buff2[i]-buff[j]));
            }
            if(yu<BUFF_LEN)break;
            yu=fread(buff,sizeof(int),BUFF_LEN,yFile);
        }while(1);
    }else if(yu<BUFF_LEN){
        do{
            for(i=0;i<zu;i++)for(j=0;j<yu;j++){
                result.insert(buff2[i]+buff[j]);
                result.insert(buff2[i]*buff[j]);
                result.insert(abs(buff2[i]-buff[j]));
            }
            if(zu<BUFF_LEN)break;
            zu=fread(buff2,sizeof(int),BUFF_LEN,zFile);
        }while(1);
    }else{
        do{
            do{
                for(i=0;i<zu;i++)for(j=0;j<yu;j++){
                    result.insert(buff2[i]+buff[j]);
                    result.insert(buff2[i]*buff[j]);
                    result.insert(abs(buff2[i]-buff[j]));
                }
                if(yu<BUFF_LEN)break;
                yu=fread(buff,sizeof(int),BUFF_LEN,yFile);
            }while(1);
            if(zu<BUFF_LEN)break;
            zu=fread(buff2,sizeof(int),BUFF_LEN,zFile);
            if(zu==0)break;
            fseek(yFile,0,SEEK_SET);
            yu=fread(buff,sizeof(int),BUFF_LEN,yFile);
        }while(1);
    }
    if(yFile)fclose(yFile);
    if(zFile)fclose(zFile);
}
void gen_set(int x[],int size)
{
    int y[N],z[N];
    int i,j,yc,zc;
    if(size<=2)return;
    if(has_set(x,size))return;
    set<int> result;
    for(i=1;i<(1<<size)-1;i+=2){
        yc=zc=0;
        for(j=0;j<size;j++){
            if(i&(1<<j)){
                y[yc++]=x[j];
            }else{
                z[zc++]=x[j];
            }
        }
        gen_set(y,yc);
        gen_set(z,zc);
        add_result(result,y,yc,z,zc);
    }
    save_set(result,x,size);
}
int _tmain(int argc, _TCHAR* argv[])
{
    int x[]={1,2,3,4,5,6,7,8,9,10,11,12};
    system("mkdir data");
    gen_set(x,N);
	return 0;
}
 | 
 |