练习18

 
  1. /*************************************************************************************
  2. 18. 在一线性七个格位置的图上有两种不同颜色的棋子A,B. 排列如下图所示,中间
  3.  格的位置为空。
  4.           ┎─┰─┰─┰─┰─┰─┰─┒
  5.           ┃A┃A┃A┃  ┃B┃B┃B┃
  6.           ┖─┸─┸─┸─┸─┸─┸─┚
  7.  要求将A,B的现行位置交换,形成下图中的排列:
  8.           ┎─┰─┰─┰─┰─┰─┰─┒
  9.           ┃B┃B┃B┃  ┃A┃A┃A┃
  10.           ┖─┸─┸─┸─┸─┸─┸─┚
  11.  移动棋子的条件:
  12.    (1) 每个格中只准放一个棋子。
  13.    (2) 任意一个棋子均可移动一格放入空格内。
  14.    (3) 一方的棋子均可跳过另一方的一个棋子进入空格。
  15.    (4) 任何棋子不得跳跃两个或两个以上棋子(无论颜色同异)
  16.    (5) 任何一个颜色棋子只能向前跳,不准向后跳。
  17.  编程完成有关的移动,并且完成具有2N+1个格子的情形. 其中两种颜色各有
  18.  N个棋子,且中间为空格.
  19.   分析: 列出最简单的几种(如N=3,N=5,N=7)的走法,总结规律
  20. **************************************************************************************/
  21. #include <stdio.h>
  22. #include <malloc.h>
  23. int count = 0;
  24. //flag = 1,空格向右移动,否则向左移动
  25. void move(char* chesses, int* ppos, int flag)
  26. {
  27.     if(flag)
  28.     { 
  29.         chesses[*ppos] = chesses[*ppos+1];
  30.         chesses[*ppos+1] = ' ';
  31.         *ppos = *ppos+1;
  32.     }
  33.     else
  34.     {
  35.         chesses[*ppos] = chesses[*ppos-1];
  36.         chesses[*ppos-1] = ' ';
  37.         *ppos = *ppos-1;
  38.     }
  39.     count ++;
  40. }
  41. //flag = 1,空格向右跳,否则向左跳
  42. void jump(char* chesses, int* ppos, int flag)
  43. {
  44.     
  45.     if(flag)
  46.     { 
  47.         chesses[*ppos] = chesses[*ppos+2];
  48.         chesses[*ppos+2] = ' ';
  49.         *ppos = *ppos + 2;
  50.     }
  51.     else
  52.     {
  53.         chesses[*ppos] = chesses[*ppos-2];
  54.         chesses[*ppos-2] = ' ';
  55.         *ppos = *ppos - 2;
  56.     }
  57.     count ++;
  58. }
  59. //显示棋子状态
  60. void print_chesses(char* chesses,int size)
  61. {
  62.     int i;
  63.     for(i=0; i<size; i++)
  64.         printf("%c",chesses[i]);
  65.     printf("/n");
  66. }
  67. void main()
  68. {
  69.     
  70.     int n;
  71.     int N;
  72.     int pos;
  73.     char* chesses;
  74.     int count_jmp = 1;
  75.     int move_dirt = 0;
  76.     int jump_dirt = 1;
  77.     int dc = 1;//计数递增方向,取-1和-1
  78.     printf("请输入一个正整数n: ");
  79.     scanf("%d", &n);
  80.     N = 2*n + 1;
  81.     pos = n;
  82.     chesses = (char*)malloc(N*sizeof(char));
  83.     {
  84.         int i;
  85.         for(i=0; i<n; i++)
  86.             chesses[i] = 'A';
  87.         chesses[i++] = ' ';
  88.         for(;i<N; i++)
  89.             chesses[i] = 'B';
  90.         print_chesses(chesses,N);
  91.     }
  92.     while(count_jmp!=0)
  93.     {
  94.         int i;
  95.         move(chesses, &pos, move_dirt);
  96.         print_chesses(chesses,N);
  97.         for(i=0; i<count_jmp; i++)
  98.         {
  99.             jump(chesses,&pos,jump_dirt);
  100.             print_chesses(chesses,N);
  101.         }
  102.         jump_dirt = !jump_dirt;
  103.         if(count_jmp == n)
  104.         {
  105.             dc = -dc;
  106.         }
  107.         else move_dirt = !move_dirt;;
  108.         count_jmp += dc;
  109.     }
  110.     move(chesses, &pos, move_dirt);
  111.     print_chesses(chesses,N);
  112.     printf("%d/n",count+1);
  113.     free(chesses);
  114. }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值