彩票排三:从0~9随机抽取3个数,组成一组数。
问题描述:
现在有这样3个5*2的矩阵I,II,III,是0~9随机的
所以每个矩阵有10的阶乘种可能。对于每一行则对应着字母从A~E;
现在对于一期彩票,假设彩票结果是:8 3 7;
那么将三个带入三个矩阵:分别的,8带入I,3带入II,7带入III,此时根据每个数字在矩阵里面的位置找到对应所在行所对应的字母,那么8对应D,3对应A,7对应E;此时组成字母DAE。
这样,这三个数带入矩阵,分别位于不同的行,则保留这个矩阵。
随着矩阵变换,形成下面矩阵,那么字母组合是DDE,重复的字母,此时这个矩形便不符合条件,剔除这个矩阵。
这样遍历完所有矩阵,剔除不符条件的,保留符合条件的矩阵。然后带入另一期的彩票开出的结果,继续剔除不符合条件的矩阵你。随着带入的彩票结果的增加,符合条件的矩阵会越来越少,直到一个临界的符合条件的矩阵的个数。既为所求结果。
#include<stdio.h>
#include<stdlib.h>
typedef int Status;
#define OK 1
#define ERROR 0
struct node{
int data[6];
struct node *next;
};
struct nodeF{
int data[5][6];
struct nodeF *next;
};
typedef struct node *LinkList;
typedef struct nodeF *LinkListF;
int count=0;
Status LinkList_Init(LinkList *L)
{
(*L) = (LinkList)malloc(sizeof(struct node));
if(!(*L))
return ERROR;
(*L)->next=NULL;
return OK;
}
Status LinkListF_Init(LinkListF *F)
{
(*F) = (LinkListF)malloc(sizeof(struct nodeF));
if(!(*F))
return ERROR;
(*F)->next=NULL;
return OK;
}
void First_Step(int (*a)[2])//生成序列
{
int i,j=0,k;
for(i=0;i<10;i++)
{
for(k=0;k<10;k++,j++)
{
if(i<k)
{
a[j][0]=i;
a[j][1]=k;
}
else if(i>=k)
{
j--;
}
}
}
}
void Print_First_Step(int (*a)[2])//打印a[45][2]
{
int i,j,cou=0;
for(i=0;i<45;i++)
{
for(j=0;j<2;j++)
{
cou++;
printf("%d ",a[i][j]);
}
printf("\n");
}
printf("%d\n",cou);
}
void Print_Three_Step(int (*val)[3],int length)//打印val[][3]
{
int i,j;
for(i=0;i<length;i++)
{
for(j=0;j<3;j++)
{
printf("%d ",val[i][j]);
}
printf("\n");
}
printf("\n");
}
void Second_Step_0(int (*a)[2],LinkList *L)//存入链表L
{
int i,j,k;
LinkList temp,p;
// p = (LinkList)malloc(sizeof(struct node));
// if(!p)
// {
// printf("malloc p ERROR");
// return ;
// }
p=(*L);
for(i=0;i<45;i++)
{
for(j=0;j<45;j++)
{
for(k=0;k<45;k++)
{
temp = (LinkList)malloc(sizeof(struct node));
if(!temp)
{
printf("malloc temp ERROR,and located %d,%d,%d",i,j,k);
return ;
}
temp->data[0]=a[i][0];
temp->data[1]=a[i][1];
temp->data[2]=a[j][0];
temp->data[3]=a[j][1];
temp->data[4]=a[k][0];
temp->data[5]=a[k][1];
p->next=temp;
p=temp;
}
}
}
p->next=NULL;
}
int LinkList_Length(LinkList L)//计算链表L长度
{
LinkList p=L->next;
int length=0;
while(p)
{
length++;
p=p->next;
}
return length;
}
long LinkListF_Length(LinkListF F)//计算链表F长度
{
LinkListF f=F->next;
long length=0;
while(f)
{
length++;
f=f->next;
}
return length;
}
void Print_Second_Step(LinkList L)//打印链表L
{
int i;
if(!L)
{
printf("ERROR:linklist is empty.\n");
return;
}
LinkList p=L->next;
while(p)
{
for(i=0;i<6;i++)
{
if(i<2)
printf("%d",p->data[i]);
printf(" ");
if(i<4&&i>=2)
printf("%d",p->data[i]);
printf(" ");
if(i<6&&i>=4)
printf("%d",p->data[i]);
}
printf("\n");
p=p->next;
}
}
void Print_LinkListF(LinkListF F)//打印链表F
{
int i,k;;
if(!F)
{
printf("ERROR:linklistF is empty.\n");
return;
}
LinkListF f=F->next;
while(f)
{
for(k=0;k<2;k++)
{
for(i=0;i<6;i++)
{
if(i<2)
printf("%d",f->data[k][i]);
printf(" ");
if(i<4&&i>=2)
printf("%d",f->data[k][i]);
printf(" ");
if(i<6&&i>=4)
printf("%d",f->data[k][i]);
}
printf("\n");
}
printf("\n----------------------------------\n");
f=f->next;
}
}
void Print_LinkListF1(LinkListF F)//打印链表F1
{
int i,k;;
if(!F)
{
printf("ERROR:linklistF is empty.\n");
return;
}
LinkListF f=F->next;
while(f)
{
for(k=0;k<5;k++)
{
for(i=0;i<6;i++)
{
if(i<2)
printf("%d",f->data[k][i]);
printf(" ");
if(i<4&&i>=2)
printf("%d",f->data[k][i]);
printf(" ");
if(i<6&&i>=4)
printf("%d",f->data[k][i]);
}
printf("\n");
}
printf("\n----------------------------------\n");
f=f->next;
}
}
void Free_Fn(LinkListF *F)//释放后期没用的链表
{
LinkListF temp,p=(*F)->next;
while(p)
{
temp=p;
p=p->next;
free(temp);
}
(*F)->next=NULL;
}
void Free_L(LinkList *L)//释放后期没用的链表
{
LinkList temp,p=(*L)->next;
while(p)
{
temp=p;
p=p->next;
free(temp);
}
(*L)->next=NULL;
}
void Third_Step(int (*val)[3],int *length)//获取n个三位数
{
/*int input;
int i,j;
printf("Input how many three-figure?::");
scanf("%d",&input);
printf("Input %d three-figure!\n",input);
for(i=0;i<input;i++)
for(j=0;j<3;j++)
{
scanf("%d",&val[i][j]);
}
*length=input;*/
int i,j;
FILE *fp;
int input;
printf("Keep documents need to be calculated in the Current Folder !\nMake sure filename is \"array\",and format is \".txt\"\n");
printf("Please enter the number of the array to be calculated.\n(Recommended not more than 34)\nhuw many?:");
scanf("%d",&input);
if((fp=fopen(".\\array.txt","r"))==NULL)
{
printf("File open failed !\n");
return;
}
for(i=0;i<input;i++)//读取
for(j=0;j<3;j++)
fscanf(fp,"%d",&val[i][j]);
for(i=0;i<input;i++)//显示
{
for(j=0;j<3;j++)
printf("%d ",val[i][j]);
printf("\n");
}
printf("\n");
fclose(fp);
*length=input;
}
void Forth_Step_0(int (*val)[3],LinkList *L,int length)//针对第一行的筛选 (L)
{
/* int i,flag=0,flag0=0;
LinkList p,s,temp;
p=(*L);
while(p)
{
s=p->next;