|
发表于 2021-11-8 11:35:07
|
显示全部楼层
本帖最后由 jhq999 于 2021-11-8 18:07 编辑
//其实用递归可能更简单
- int main()//其实用递归可能更简单
- {
- int num=12,h=0,i=0,istart=0,jstart=0,j=0,k=0,L=0,Lstart=1,m=0;
- int a[12+1][12+1]={0},b[6][2]={0};//数组a表示所有的对阵,包括自己和自己对阵和没有的0队,为了方便直接把0队也放里面了
- //数组b一天的对阵,例如第一组对阵1队对3队,那么b[0][0]=1,b[0][1]=3,以此类推
- for (i = 0; i < num+1; i++)//图一,去掉0队和重复对阵
- {
- a[0][i]=1;
- a[i][0]=1;
- for (j = 1; j < i+1; j++)
- {
- a[i][j]=1;
- }
- }
- Lstart=1,istart=2,jstart=1;
- for ( h = 2; h <=num; h++)
- {
- b[0][0]=1,b[0][1]=h;//先装入1队和其他队对阵作为第一组
- L=Lstart;
-
- for (i = istart; i <= num; i++)//i表示每一组对阵的第一个队
- {
- //istart=2;
- if (L==num/2)//b满员退出,节省循环次数
- {
- break;
- }
- for (int j = jstart; j <= num; j++)//j表示每一组对阵的第二个队
- {
- //jstart=1;
- if (!a[i][j])//没有过对阵
- {
- for (m = 0; m < L; m++)
- {
- if ((b[m][1]==i)||(b[m][1]==j))break;//一组里面的队和前面对阵对比是否前面已经对过阵了
- }
- if (L==m)//这一组对阵的队没有对过阵,加入对阵
- {
- b[L][0]=i,b[L][1]=j;
- L++;
- break;
- }
- }
- }
- }
- if (L==num/2)//正确不重复对阵满员,输出
- {
- for ( m = 0; m <L; m++)
- {
- a[b[m][0]][b[m][1]]=1;//设置成1表示这组对阵已经用过
- printf("%d-%d,",b[m][0],b[m][1]);
- }
- printf("\n");
- Lstart=1,istart=2,jstart=1;
- }
- else if((num+1)==j)//b没有满员,而且整个循环结束,回到b数组上一组,且从记录的j再加一开始循环,
- {
-
- L--;
- while(b[L][1]==num)//记录的j是最后一个,那么再寻找前面那一组
- {
- L--;
- }
- Lstart=L;
- h--;
- istart=b[L][0];
- jstart=b[L][1]+1;
- }
- }
- return 0;
- }
复制代码 |
-
图一
|