排列组合

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 3//N为格子数
//#define HENG "----------------------------------------------/n"
#define STAR "******************************************************** /n"
#define HENG "---------------------------------------------------------------------/n"
#define BLANK "|  1   |  2    |  3    |  4     |  5    |  6   | 7     | /n"
enum Color{WHITE,RED,BLUE,GREEN};
char *se[]={"    ","RED","BLUE","GREEN"};
char *s[]={"BLANK","BLANK","BLANK","BLANK","BLANK","BLANK","BLANK"};
typedef struct {
    int gz[N];
    int num;
    }GZ ;
GZ *G;
int gezi[N],k,k1,count=0,M,cn=0;
FILE *fp1,*fp2;
void print(GZ g1,GZ g2,GZ g3);
int ShangSe(GZ g,GZ c[])
{
    int i,i1,i2,cur[3]={},j=0,ct=0;
    switch(g.num)
    {
        case 1: for(i=0;i<N;i++)
                if(g.gz[i]!=0)
                {cur[j]=i;break;}
                for(i=1;i<N;i++)
                c[ct++].gz[cur[j]]=i;
                break;
        case 2: for(i=0;i<N;i++)
                if(g.gz[i]!=0)
                {cur[j++]=i;}
                for(i=1;i<N;i++)
                for(i1=1;i1<N;i1++)
                {
                c[ct].gz[cur[0]]=i;
                c[ct].gz[cur[1]]=i1;
                ct++;
                }break;
        case 3: for(i=0;i<N;i++)
                if(g.gz[i]!=0)
                {cur[j++]=i;}
                for(i=1;i<N;i++)
                for(i1=1;i1<N;i1++)
                for(i2=1;i2<N;i2++)
                {
                c[ct].gz[cur[0]]=i;
                c[ct].gz[cur[1]]=i1;
                c[ct].gz[cur[2]]=i2;
                ct++;
                }
                break;
        default: break;
    }
    return ct;
    printf("ct=%d/n",ct);
    //printf("cur=%d/n",cur[0]);
    for(i=0;i<ct;i++)
    printf("%d %d %d/n",c[i].gz[0],c[i].gz[1],c[i].gz[2]);
    printf("/n");
    //print(c[0],c[1],c[2]);
}
               
void print(GZ g1,GZ g2,GZ g3)
{
     int i,color;
     for(i=0;i<N;i++)
     {
     s[i]=se[g1.gz[i]];
     fprintf(stdout,"%-8s",s[i]);
     }
     fprintf(stdout,"/n");
     //g2.gz[2]=2;
     for(i=0;i<N;i++)
     {
     s[i]=se[g2.gz[i]];
     fprintf(stdout,"%-8s",s[i]);
     }
     fprintf(stdout,"/n");
     //g3.gz[0]=1;
     for(i=0;i<N;i++)
     {
     s[i]=se[g3.gz[i]];
     fprintf(stdout,"%-8s",s[i]);
     }
     fprintf(stdout,"/n");
     fprintf(stdout,"/n");
}

void Color1(GZ g1,GZ g2,GZ g3)
{
     GZ gc[3][28]={};
     int ct[3]={},i=0,i1,i2;
     //for(i=0;i<3;i++)
     ct[0]=ShangSe(g1,gc[0]);
     ct[1]=ShangSe(g2,gc[1]);
     ct[2]=ShangSe(g3,gc[2]);
     for(i=0;i<3;i++)
     printf("%d/n",ct[i]);
     for(i=0;i<ct[0];i++)
     for(i1=0;i1<ct[1];i1++)
     for(i2=0;i2<ct[2];i2++)
     print(gc[0][i],gc[1][i1],gc[2][i2]);
         
}
    

void Color(GZ g1,GZ g2,GZ g3)
{
    int color1,color2,color3,color4,color,i,t=0,ct=0;
    //printf("RED= %d,BLUE=%d/n",RED,BLUE);
     //loop:
     //while(g1.num>0)
     for(color1=RED;color1<=BLUE;color1++)
     for(color2=RED;color2<=BLUE;color2++)
     for(color3=RED;color3<=BLUE;color3++)
     //for(color4=RED;color4<=BLUE;color4++)
     {
          for(i=0;i<N;i++)
          {
          if(g1.gz[i]!=0)
          {
          g1.gz[i]=color1;
          g1.num--;
          }
          }
          //for(color4=RED;color4<=BLUE;color4++)
          //g1.gz[2]=color4;
         
          for(i=0;i<N;i++)
          {
          if(g2.gz[i]!=0)
          {
          g2.gz[i]=color2;
          //continue;
          //printf("i=%d/n",i);
          }
          }
          for(i=0;i<N;i++)
          {
          if(g3.gz[i]!=0)
          {
          g3.gz[i]=color3;
          //continue;
          //printf("i=%d/n",i);
          }
          }
          print(g1,g2,g3);
          t++;
     }
     printf("t=%d/n",t);
}
void Print(GZ *g,int pos,FILE *fp)
{
    int i;
    fprintf(fp,"|");
    for(i=0;i<N;i++)
    {
        if(g->gz[i]!=0)
        fprintf(fp,"%3d|",g->gz[i]);
        else
        fprintf(fp,"   |");
    }
    fprintf(fp,"-----> %d/n",pos);
}
void Assign(void)
{
    int i,j=0;
    for(i=0;i<N;i++)
    {
    if(gezi[i]!=0)
    {
        G[count-1].gz[gezi[i]-1]=gezi[i];
        j++;
    }
    G[count-1].num=j;
    }
    Print(G+count-1,count,fp1);
}
   
void Chose(int a1,int a2)
{
    int i;
   
    if(0==a2){
    count++;
    cn++;
    Assign();
    return;}
    for(i=a1;i<=N;i++)
    {
        gezi[k++]=i;
        Chose(i+1,a2-1);
        k--;
    }
}

void ZuHe(FILE *fp)//组合
{
    for(M=1;M<=N;M++)
    {
        Chose(1,M);//从1开始,在N个格子中选M个格子
        fputs(STAR,fp1);
        fprintf(fp,"说明:%d个方格中选中 <%d>个方格, 需要的组合计数等于:=  %d/n",N,M,cn);
        fputs(STAR,fp1);
        cn=0;
    }
    fprintf(fp,"组合数: %d/n",count);
   
   
}
int Print_pailie(FILE *fp,int g1,int g2,int g3,int ck)
{
    int k1,k2,k3;
    for(k1=0;k1<count;k1++)
    for(k2=0;k2<count;k2++)
    for(k3=0;k3<count;k3++)
    {
    if(G[k1].num==g1&&G[k2].num==g2&&G[k3].num==g3)
    {
        fprintf(fp,"第一排(选%d个格子)     ",G[k1].num);
        Print(G+k1,ck,fp);
        fprintf(fp,"第二排(选%d个格子)     ",G[k2].num);
        Print(G+k2,ck,fp);
        fprintf(fp,"第三排(选%d个格子)     ",G[k3].num);
        Print(G+k3,ck,fp);
        fprintf(fp,"/n");
        ck++;
    }
    }
    return ck;
}
void PaiLie(FILE *fp)//排列
{
    int ck=1,g1,g2,g3;
    for(g1=1;g1<=N;g1++)
    for(g2=1;g2<=N;g2++)
    for(g3=1;g3<=N;g3++)
        ck=Print_pailie(fp,g1,g2,g3,ck);
    fprintf(fp,"排列数: %d/n",ck-1);
}
int main(void)
{
    /*G=(GZ*)calloc(1024,sizeof(GZ));
   
    if((fp1=fopen("d://组合1.txt","w"))==NULL)
    {
        puts("Can't creat file");
        return -1;
    }
    if((fp2=fopen("d://排列1.txt","w"))==NULL)
    {
        puts("Can't creat file");
        return -1;
    }
    ZuHe(fp1);
    PaiLie(fp2);
    fclose(fp1);
    fclose(fp2);*/
    GZ g1,g2,g3,g;
    g1.gz[0]=1;
    g1.gz[1]=1;
    g1.gz[2]=1;
    g1.num=3;
    g2.gz[0]=0;
    g2.gz[1]=0;
    g2.gz[2]=1;
    g2.num=1;
    g3.gz[0]=0;
    g3.gz[1]=1;
    g3.gz[2]=1;
    g3.num=2;
    //print(g,g,g);
    //Color(g1,g2,g3);
    //printf("%d/n",g1.gz[2]);
    //Color1(&g,0,3);
    //printf("count=%d/n",count);
    //ShangSe(g3);
    Color1(g1,g2,g3);
    getchar();
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值