#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;
}