练习4

 
  1.  /*********************************************************************
  2. 4. 在N行N列的数阵中, 数K(1〈=K〈=N)在每行和每列中出现且仅
  3.   出现一次,这样的数阵叫N阶拉丁方阵。例如下图就是一个五阶拉丁方阵。
  4.   编一程序,从键盘输入N值后,打印出所有不同的N阶拉丁方阵,并统计个数。
  5.         1  2  3  4  5
  6.         2  3  4  5  1
  7.         3  4  5  1  2
  8.         4  5  1  2  3
  9.         5  1  2  3  4
  10.  *********************************************************************/
  11. /**********************************************************************
  12. 解决方法:
  13. 1.生成1~N的排列
  14. 2.按照上面错位输出
  15. 3.对于每一种1~N的排列执行1,2
  16. //关键是生成排列
  17. *********************************************************************/
  18. #include <stdio.h>
  19. #include <malloc.h>
  20. static int *pnNum;
  21. static int N;
  22. static int count;
  23. void output()
  24. {
  25.  int i;
  26.  for(i=0; i<N; i++)
  27.  {
  28.   int k;
  29.   for(k=0; k<N; k++)
  30.   {
  31.    printf("%3d",pnNum[(i+k)%N]);
  32.   }
  33.   printf("/n");
  34.  }
  35.  printf("/n");
  36. }
  37. //生成一个排列
  38. void perm(int k)
  39. {
  40.  int m;
  41.  if(k == N-1)
  42.  {
  43.   //输出
  44.   count++;
  45.   output();
  46.   return ;
  47.  }
  48.  for(m=k; m<N; m++)
  49.  {
  50.   int temp;
  51.   temp = pnNum[m];
  52.   pnNum[m] = pnNum[k];
  53.   pnNum[k] = temp;
  54.   perm(k+1);
  55.   temp = pnNum[m];
  56.   pnNum[m] = pnNum[k];
  57.   pnNum[k] = temp;
  58.  }
  59. }
  60. void main()
  61. {
  62.  int i;
  63.  printf("请输入一个正整数N:");
  64.  scanf("%d",&N);
  65.  if(N<0)
  66.  {
  67.   printf("N不符合!/n");
  68.   return;
  69.  }
  70.  pnNum = (int*)malloc(N*sizeof(int));
  71.  for(i=0; i<N; i++)
  72.  {
  73.   pnNum[i] = i+1;
  74.  }
  75.  perm(0);
  76.  printf("总数%d/n",count);
  77.  free(pnNum);
  78. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值