#define M 8 //8個數
#define N 6 //選6個
int step=0; //步,也就是生成的數組到第幾個了
int old[100][N]; //把生成的數組放到這個二維數組中
int num[100]; //作輸出記錄
int T=0;
int router(int *s,int *str)
{
int i,j,k,sum;
for(j=0;j<N;j++) //把新生成的組合放到old數組中
{
old[step][j]=s[j];
}
step++;
for(i=0;i<step-1;i++) //控制從記錄下來的第壹個數組開始判斷
{
sum=0;
for(j=0;j<T;j++) //判斷old[i][]是否輸出過
{
if(num[j]==i)
break;
}
if(j>=T) //j>=T說明沒有與輸出記錄相同的
continue; //所以就不用判斷了
for(j=0;j<N;j++) //old數組的遍歷
{
for(k=0;k<N;k++) //s數組的遍歷
{
if(old[i][j]==s[k]) //如果old數組中有數與s數組相同
sum++; //則sum++
}
}
if(sum==5) //如果有五個相同的
{
return 0;
}
}
num[T]=step-1; //記錄輸出了的數組的下標,以供下次判斷用
T++;
return 1;
}
void pl(int *str,int *s,int t)
{
int i;
if(t==N && router(s,str)) //t==N 算完了壹行,並且符合規則,就輸出
{
for(i=0;i<N-1;i++)
{
if(str[s[i]]<10) //小於10就加個0在前面
{
printf("0");
}
printf("%d-",str[s[i]]);
}
if(str[s[i]]<10) //小於10就加個0在前面
printf("0");
printf("%d\n",str[s[i]]);
}
else
{
for(i=t;i<M;i++)
{
if(t==0 || s[t-1]<i)
{
s[t]=i;
pl(str,s,t+1); //這遞歸
}
}
}
}
int main()
{
int s[M],str[]={1,2,3,6,8,9,12,16};
pl(str,s,0);//str是要求排序的數字,s是用來排序,最後以s為下標(str(s[]))的形式輸出的
//0表示從下標0開始
return 0;
}
/*
不想班門弄斧了,不過見沒人回答就做壹下,看對不對吧
思路:
把排列好的數記錄到壹個數組中,每次輸出前都判斷
是否有和前面輸出過的數相同數是五個的,如果有相
同則不輸出,沒有,就輸出,並記錄下輸出的數組所在
下標,以供下次判斷時用.
*/