- 注册时间
- 2008-6-19
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 1806
- 在线时间
- 小时
|
发表于 2008-8-14 21:28:11
|
显示全部楼层
好不容易找到了
- #include <stdio.h>
- #include <iostream.h>
- #define N 60+20
- struct sd
- {
- long int father;
- int brother;
- int me;
- char str[4];
- }date[2147483647];// ^Q^
- int line_num,point_num=0;
- char line_list[24][4],n_free[20],y_free[20];
-
- int main(int argc, char *argv[])
- {
- long int end_line=0,i,now_line=0,e;
- int j,k,max,m,f,n,y,x,c,a,b,d,w;
- FILE* f_out;
- f_out=fopen("d:\\date_out.txt","w");
- date[end_line].father=-1;
- for(w=0;w<4;w++)
- line_list[0][w]=date[end_line].str[w]='A'+w;
-
- for(now_line=0;;)
- {
- for(i=now_line,j=1;i>0;j++)
- {
- for(k=0;k<4;k++)line_list[j][k]=date[i].str[k];
- i=date[i].father;
- }
- line_num=j;
- for(m=0,point_num=0;m<line_num;m++)for(j=0;j<4;j++)
- {
- max=line_list[m][j];
- if(max>point_num)point_num=max;
- }
- for(k=point_num,f=0,n=0,y=0;k>64;k--)
- {
- for(m=0;m<line_num;m++)for(j=0;j<4;j++)
- if(k==line_list[m][j])f++;
- if(f>1)f=0,n_free[n]=k,n++;
- if(f==1)f=0,y_free[y]=k,y++;
- }
- for(m=0;m<line_num;m++)for(j=0;j<4;j++)for(k=0;k<y;k++)
- if(y_free[k]==line_list[m][j]){
- n_free[n]=y_free[k];
- n++;
- k=y;
- j=4;
- }
- e=end_line+1,d=0;
- for(x=4;x>=0;x--)//搜索下一层//囧现在是从4到0,如果从0到4...
- {
- j=point_num;
- switch(x)
- {
- case 0:
- if((point_num-x<=N)&&(x<=n))
- {
- date[++end_line].father=now_line;
- for(w=0;w<4;w++)
- date[end_line].str[w]=++j;
- date[end_line].me=(++d);
- }
- break;
- case 1:
- if((point_num-x<=N)&&(x<=n))for(k=0;k<n;k++)
- {
- date[++end_line].father=now_line;
- date[end_line].str[0]=n_free[k];
- for(w=1;w<4;w++)
- date[end_line].str[w]=++j;
- date[end_line].me=(++d);
- j=point_num;
- }
- break;
- case 2:
- if((point_num-x<=N)&&(x<=n))for(k=0,c=0;k<n-1;k++)for(m=k+1;m<n;m++)
- {
- for(y=0;y<line_num;y++)
- {
- for(f=0;f<4;f++)
- if(n_free[k]==line_list[y][f]||n_free[m]==line_list[y][f])
- c++;
- if(c>1)
- y=line_num;
- else
- c=0;
- }
- if(c>1)
- c=0;
- else{
- date[++end_line].father=now_line;
- date[end_line].str[0]=n_free[k];
- date[end_line].str[1]=n_free[m];
- date[end_line].str[2]=++j;
- date[end_line].str[3]=++j;
- date[end_line].me=(++d);
- j=point_num;
- }
- }
- break;
- case 3:
- if((point_num-x<=N)&&(x<=n))for(k=0,c=0;k<n-2;k++)for(m=k+1;m<n-1;m++)for(a=m+1;a<n;a++)
- {
- for(y=0;y<line_num;y++)
- {
- for(f=0;f<4;f++)
- if(n_free[k]==line_list[y][f]||n_free[m]==line_list[y][f]||n_free[a]==line_list[y][f])c++;
- if(c>1)
- y=line_num;
- else
- c=0;
- }
- if(c>1)
- c=0;
- else{
- date[++end_line].father=now_line;
- date[end_line].str[0]=n_free[k];
- date[end_line].str[1]=n_free[m];
- date[end_line].str[2]=n_free[a];
- date[end_line].str[3]=++j;
- date[end_line].me=(++d);
- j=point_num;
- }
- }
- break;
- case 4:
- if((point_num-x<=N)&&(x<=n))for(k=0,c=0;k<n-3;k++)for(m=k+1;m<n-2;m++)for(a=m+1;a<n-1;a++)for(b=a+1;b<n;b++)
- {
- for(y=0;y<line_num;y++)
- {
- for(f=0;f<4;f++)
- if(n_free[k]==line_list[y][f]||n_free[m]==line_list[y][f]||n_free[a]==line_list[y][f]||n_free[b]==line_list[y][f])c++;
- if(c>1)
- y=line_num;
- else
- c=0;
- }
- if(c>1)
- c=0;
- else{
- date[++end_line].father=now_line;
- date[end_line].str[0]=n_free[k];
- date[end_line].str[1]=n_free[m];
- date[end_line].str[2]=n_free[a];
- date[end_line].str[3]=n_free[b];
- date[end_line].me=(++d);
- }
- }
- break;
- }
- }
- for(i=e;i<=end_line;i++)
- date[i].brother=date[end_line].me;
- if(d==0)
- {
- while(date[now_line].me==date[now_line].brother)
- now_line=date[now_line].father;
- now_line++;
- end_line=now_line+(date[now_line].brother-date[now_line].me);
- d=1;
- if(now_line==1)
- exit(0);
- }
- else
- now_line=e;
- if(line_num>23)//输出符合条件的解
- {
- for(y=0;y<line_num;y++)
- {
- for(f=0;f<4;f++)
- fprintf(f_out,"%c",line_list[y][f]);//输出到文件
- fprintf(f_out," ");
- }
- fprintf(f_out,"\n");
- // cout<<line_num<<' ';
- // if(line_num>24)break;//找到大于24的解就退出
- }
- }
- return 0;
- }
- /*************************************************************
- /*第03行‘#define N 60+20’处的20表示最大点数,可更改
- /*第97行‘if(line_num>24)’处的line_num表示线的条数,条件可更改
- /*
复制代码 |
评分
-
查看全部评分
|