【例7.6】黑白棋子的移动

【例7.6】黑白棋子的移动

链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1327
时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

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

○○○○○●●●●●

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

○●○●○●○●○●

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

【输入】

输入n。

【输出】

移动过程。

【输入样例】

7

【输出样例】

step 0:ooooooo*******--
step 1:oooooo--******o*
step 2:oooooo******--o*
step 3:ooooo--*****o*o*
step 4:ooooo*****--o*o*
step 5:oooo--****o*o*o*
step 6:oooo****--o*o*o*
step 7:ooo--***o*o*o*o*
step 8:ooo*o**--*o*o*o*
step 9:o--*o**oo*o*o*o*
step10:o*o*o*--o*o*o*o*
step11:--o*o*o*o*o*o*o*题解:根据样例得先把多的棋子移走,移成四个一组的
#include<iostream>
#include<cstring>
#include<cstdio>
#include<iomanip>
using namespace std;
int n,sp,step;
char a[101];
void print()
{
    cout<<"step"<<setw(2)<<step<<":";
    for(int i=1;i<=2*n+2;i++)
    printf("%c",a[i]);
    cout<<endl;
    step++;
}
void inti(int n)
{
    for(int i=1;i<=n;i++)a[i]=‘o‘;
    for(int i=n+1;i<=2*n;i++)a[i]=‘*‘;
    a[2*n+1]=a[2*n+2]=‘-‘;
    sp=2*n+1;
    print();
}
void mv(int k)
{
    a[sp]=a[k];a[sp+1]=a[k+1];
    a[k]=‘-‘;a[k+1]=‘-‘;
    sp=k;
    print();
}
void work(int n)
{
    if(n==4)
    {
        mv(4);mv(8);mv(2);mv(7);mv(1);
    }
    else
    {
        mv(n);mv(2*n-1);work(n-1);
    }
}
int main()
{
    cin>>n;
    inti(n);
    work(n);
}
				
时间: 2024-11-06 03:55:26

【例7.6】黑白棋子的移动的相关文章

黑白棋子的移动(分治)

黑白棋子的移动(chessman) [问题描述] 有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形: ○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置.每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子.如n=5时,成为: ○●○●○●○●○● 任务:编程打印出移动过程. [输入样例]chessman.in 7 [输出样例]chessma

【递归】黑白棋子的移动

描述 有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况: ○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置.每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子.如n=5时,成为: ○●○●○●○●○● 题目 编程打印出移动过程. 输入 一个整数n(n<=100) 输出 若干行,表示初始状态和每次移动的状态,用"o"表示白子

黑白棋子交换

问题: 在一个有七个格子的盒子里,左边放着3个白球,第四个是空的,右边三个是黑球 游戏规则: 1.一次只能移动一个棋子 2.棋子可以向空格中移动,也可以跳过一个对方的棋子进入空格. 3.白色棋子只能向右移动,黑色棋子只能向左移动,不能跳过两个子. #include <stdio.h> #include <stdlib.h> int number; void print(int a[]); void change(int *n, int *m); /* run this progra

棋子翻转

题目描述 在4x4的棋盘上摆满了黑白棋子,黑白两色的位置和数目随机其中左上角坐标为(1,1),右下角坐标为(4,4),现在依次有一些翻转操作,要对一些给定支点坐标为中心的上下左右四个棋子的颜色进行翻转,请计算出翻转后的棋盘颜色. 给定两个数组A和f,分别为初始棋盘和翻转位置.其中翻转位置共有3个.请返回翻转后的棋盘. 测试样例: [[0,0,1,1],[1,0,1,0],[0,1,1,0],[0,0,1,0]],[[2,2],[3,3],[4,4]] 返回:[[0,1,1,1],[0,0,1,0

【题解】棋子

题目描述 小Z在家闲得无聊,摆弄起了围棋棋子.也许是小Z有自虐倾向,他出了个难题给自己,结果竟然把自己难住了.你作为他的朋友,决定帮助他解决难题. 有一个m×n的棋盘,需要在上面摆满黑白棋子.小Z有一个奇怪的规则:如果有两个棋子相邻(上下左右),且一白一黑.则黑的必须在上面(或左边).黑白棋子都是足够多的.小Z想知道共有多少种不同的摆法(只要略有不同就算一种). 输入格式 一行,包括两个正整数m和n. 输出格式 一行,包括一个正整数ans,表示共有多少种不同的摆法. 输入样例 2 2 输出样例

[CQOI2012]交换棋子(最小费用最大流)

[CQOI2012]交换棋子(luogu) Description 题目描述 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子, 最终达到目标状态.要求第i行第j列的格子只能参与mi,j次交换. 输入格式 第一行包含两个整数n,m(1<=n, m<=20).以下n行为初始状态,每行为一个包含m个字符的01串, 其中0表示黑色棋子,1表示白色棋子.以下n行为目标状态,格式同初始状态. 以下n行每行为一个包含m个0~9数字的字符串,表示每个格子参与交换的次

Codevs 1004 四子连棋

1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局. ● ○ ●   ○ ● ○ ● ● ○ ● ○ ○ ● ○   输入描述 Input

1004 四子连棋

1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局. ● ○ ●   ○ ● ○ ● ● ○ ● ○ ○ ● ○   输入描述 In

紫书第4章 函数和递归

1  序 系统的整理下第四章的学习笔记.同上次一样,尽量在不依赖书本的情况下自己先把例题做出来.这次有许多道题代码量都比较大,在例题中我都用纯C语言编写,但由于习题的挑战性和复杂度,我最终还是决定在第五章开始前,就用C++来完成习题.不过所有的代码都是能在C++提交下AC的. 在习题中,我都习惯性的构造一个类来求解问题,从我个人角度讲,这会让我的思路清晰不少,希望自己的一些代码风格不会影响读者对解题思路的理解. 其实在第四章前,我就顾虑着是不是真的打算把题目全做了,这些题目代码量这么大,要耗费很