| 
注册时间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表示线的条数,条件可更改
/*
 | 
评分
查看全部评分
 |