- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 40149
- 在线时间
- 小时
|
楼主 |
发表于 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;
- }
复制代码 |
|