练习22

 
  1. /*****************************************************************************
  2.  22. 在一个4*4的小方格(如图所示)中放置8个*号,使得每行每列放且
  3.  仅放两个*号。
  4.           ┌─┬─┬─┬─┐
  5.           │*│*│  │  │
  6.           ├─┼─┼─┼─┤
  7.           │*│  │*│  │
  8.           ├─┼─┼─┼─┤
  9.           │  │*│  │*│
  10.           ├─┼─┼─┼─┤
  11.           │  │  │*│*│
  12.           └─┴─┴─┴─┘
  13.  求出所有的基本解。
  14.  *****************************************************************************/
  15. #include <stdio.h>
  16. #define N 4
  17. int a[] = {0,0,0,1,1,2};
  18. int b[] = {1,2,3,2,3,3};
  19. static int path[N];
  20. int checked(int k)
  21. {
  22.     int i;
  23.     int col[N];
  24.     for(i=0; i<N; i++)
  25.         col[i] = 0;
  26.     for(i=0; i<=k; i++)
  27.     {
  28.         col[a[path[i]]] ++;
  29.         col[b[path[i]]] ++;
  30.     }
  31.     for(i=0; i<N; i++)
  32.     {
  33.         if(col[i] > 2)
  34.             return 0;
  35.     }
  36.     return 1;
  37. }
  38. void ShowPath()
  39. {
  40.     int row,col;
  41.     for(row=0; row<N; row++)
  42.     {
  43. //      printf("%3d",path[row]);
  44.         for(col=0; col<N; col++)
  45.         {
  46.             if(col==a[path[row]] || col==b[path[row]])
  47.                 printf(" *");
  48.             else printf(" O");
  49.         }
  50.         printf("/n");
  51.     }
  52.     printf("/n");
  53. }
  54. void main()
  55. {
  56.     int flag = 0;
  57.     int k; 
  58.     for(k=0; k<N; k++)
  59.         path[k] = -1;
  60.     k=0;
  61.     while(k>=0)
  62.     {
  63.         while(++path[k]<6)
  64.         {
  65.             if(checked(k) && k<N-1)
  66.             {
  67.                 k++;
  68.             }
  69.             else if(checked(k) && k==N-1)
  70.             {
  71.                 flag = 1;
  72.                 ShowPath();
  73.                 getchar();
  74.                 path[k] = -1;
  75.                 k--;
  76.             }
  77.         }
  78.         path[k] = -1;
  79.         k--;
  80.     }
  81.     if(!flag)
  82.     {
  83.         printf("no solve!/n");
  84.     }
  85. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值