C语言程序设计之黑白棋子的移动

问题描述

C语言课设项目、小游戏大全 源 码 免 费 下 载 链 接 如 下:

c语言项目课设小游戏源码资料压缩包.zip-C文档类资源-CSDN下载c语言项目课设小游戏源码资料压缩包.zipc语言项目课设小游戏源码资料压缩包.zipc语言项目课设小更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/chengxuyuanlaow/86749012

有2n个棋子排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5 的情况:

○○○○○●●●●●

移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如 n=5时,成为:

○●○●○●○●○●

任务:编程打印出移动过程。

输入

一个整数 n(4≤n≤100)。

输出

若干行,表示初始状态和每次移动的状态,用"o"表示白子,"*"表示黑子,"-"表示空行。

输入样例

7

输出样例

ooooooo*******--

oooooo--******o*

oooooo******--o*

ooooo--*****o*o*

ooooo*****--o*o*

oooo--****o*o*o*

oooo****--o*o*o*

ooo--***o*o*o*o*

ooo*o**--*o*o*o*

o--*o**oo*o*o*o*

o*o*o*--o*o*o*o*

--o*o*o*o*o*o*o*

(1)编程思路。

由输出样例可以看出,对于n>4的棋子的移动,每次移动棋子的操作可以把中间两个棋子“o*”移到最后,再把连续黑子中的后面两个棋子“**”移到中间,这样n个棋子的移动变成了n-1个棋子的移动,一直递归调用到n==4的时候,按样例固定输出即可。

(2)源程序。

#include <stdio.h>

char chess[205];

void move(int x,int y)

{

    char ch;

    ch=chess[x];

    chess[x]=chess[y];

    chess[y]=ch;

}

void work (int n)

{

    int i;

    if (n==4)

    {

        move(3,8); move(4,9);

        printf("%s\n",chess);

        move(3,7); move(4,8);

        printf("%s\n",chess);

        move(1,7); move(2,8);

        printf("%s\n",chess);

        move(1,6); move(2,7);

        printf("%s\n",chess);

        move(0,6); move(1,7);

        printf("%s\n",chess);

        return;

    }

    move(n-1,2*n);

    move(n,2*n+1);

    printf("%s\n",chess);

    move(n-1,2*n-2);

    move(n,2*n-1);

    printf("%s\n",chess);

    work (n-1);

}

int main()

{

    int n;

    scanf("%d", &n);

    int i;

    for (i=0;i<n;i++)

       chess[i]='o';

    for (i=n;i<2*n;i++)

       chess[i]='*';

    chess[2*n]='-';

    chess[2*n+1]='-';

    chess[2*n+2]='\0';     

    printf("%s\n",chess);

    work (n);

    return 0;

}

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不安分的小女孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值