[codevs2230]黑白棋子
题目链接
http://www.luogu.org/problem/show?pid=1259#
http://codevs.cn/problem/2230/
题目描述
有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况:
○○○○○●●●●●
移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:
○●○●○●○●○●
任务:编程打印出移动过程。
输入输出格式
输入格式:
一个整数n(n<=50)
输出格式:
若干行,表示初始状态和每次移动的状态,用"o"表示白子,"x"表示黑子,"-"表示空行。
输入输出样例
输入样例#1:
7
输出样例#1:
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*
思路
分析样例数据可以看到,在最前方的白棋还剩下三个以上时,我们可以把最后一个白棋和其后的第一个黑棋一起移动到空格的位置,输出,然后把最后两个黑棋移动到空格的位置,输出。在最前方的白棋还剩下3个时,继续这样的方法就不适用了。因为无论如何都会到达还剩三步的状态,所以寻找规律直接输出最后几行即可。
四个指针的作用:l:连续的最后一个白棋出现的位置;h:连续的最后一个黑棋出现的位置;j第一个空格的位置;k:最后一个空格的位置
var a:array[..] of char;
n,i,j,k,l,h,x,y:longint; procedure printf;
var i:longint;
begin
for i:= to *n+ do write(a[i]);
writeln;
end; begin
readln(n);
for i:= to n do
a[i]:='o';
for i:=n+ to n* do
a[i]:='*';
a[*n+]:='-';
a[*n+]:='-';
printf;
l:=n;//last'o'
h:=*n;//last'*'
j:=*n+;k:=*n+;//'-'
while l> do
begin
a[j]:=a[l];
a[k]:=a[l+];
a[l]:='-';
a[l+]:='-';
printf;
a[l]:='*';
a[l+]:='*';
a[h]:='-';
a[h-]:='-';
if l<> then printf;
k:=h;
j:=h-;
dec(l);
dec(h,);
end;
write('ooo*o**--*');
for i:= to n- do write('o*');
writeln;
write('o--*o**oo*');
for i:= to n- do write('o*');
writeln;
write('o*o*o*--o*');
for i:= to n- do write('o*');
writeln;
write('--o*o*o*o*');
for i:= to n- do write('o*');
writeln;
end.
当然,你也可以机(wu)智(chi)地寻找字符串之间的规律然后输出,虽然本人对于这种乱搞的做法表示十分愤慨,不过还是给大家把代码贴上。
program st;
var n,i,j:longint;
begin
read(n);
for j:= to *(n-)- do
begin
//write('step ',j,':');
for i:= to n-(j+) div do
write('o');
if j mod <> then write('--');
for i:= to n-(j+) div do
write('*');
if j mod = then write('--');
for i:= to (j+) div do write('o*');
writeln;
end;
// write('step ',j+,':');
write('ooo*o**--*');
for i:= to n- do write('o*');
writeln;
// write('step ',j+,':');
write('o--*o**oo*');
for i:= to n- do write('o*');
writeln;
// write('step ',j+,':');
write('o*o*o*--o*');
for i:= to n- do write('o*');
writeln;
//write('step ',j+,':');
write('--o*o*o*o*');
for i:= to n- do write('o*');
writeln;
end.
[codevs2230]黑白棋子的更多相关文章
- 【分治】黑白棋子的移动-C++
题目描述 有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况: ○○○○○●●●●● 移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也 ...
- 在4x4的棋盘上摆满了黑白棋子,黑白两色的位置和数目随机其中左上角坐标为(1,1),右下角坐标为(4,4),现在依次有一些翻转操作,要对一些给定支点坐标为中心的上下左右四个棋子的颜色进行翻转,请计算出翻转后的棋盘颜色。
// ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...
- BZOJ.2668.[CQOI2012]交换棋子(费用流zkw)
题目链接 首先黑白棋子的交换等价于黑棋子在白格子图上移动,都到达指定位置. 在这假设我们知道这题用网络流做. 那么黑棋到指定位置就是一条路径,考虑怎么用流模拟出这条路径. 我们发现除了路径的起点和终点 ...
- Java实例---黑白五子棋[单机版]
程序分析 FiveChessFrame.java package com.ftl.frame; import java.awt.Color; import java.awt.Font; import ...
- bzoj 2756奇怪的游戏
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MB Description Blinke 最近喜欢上一个奇怪的游戏. 这个游戏 ...
- codevs1004四子连棋[BFS 哈希]
1004 四子连棋 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗 ...
- Codevs p1004 四子连棋
四子连棋 题目描述 Description 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向 ...
- 【宽度优先搜索】神奇的状态压缩 CodeVs1004四子连棋
一.写在前面 其实这是一道大水题,而且还出在了数据最水的OJ上,所以实际上这题并没有什么难度.博主写这篇blog主要是想写下一个想法--状态压缩.状态压缩在记录.修改状态以及判重去重等方面有着极高的( ...
- BNUOJ 13105 nim博弈
ncredible Chess Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on LightOJ. Ori ...
随机推荐
- javascript函数基础
Function类型 由于函数是对象,因此函数名实际上是一个指向函数对象的指针,不会与函数绑定 所以没有重载这个概念!!!!!!!!!!!!!!!!!!!!!!!!!! function sum1() ...
- 纯原生js移动端图片压缩上传插件
前段时间,同事又来咨询一个问题了,说手机端动不动拍照就好几M高清大图,上传服务器太慢,问问我有没有可以压缩图片并上传的js插件,当然手头上没有,别慌,我去网上搜一搜. 结果呢,呵呵...诶~又全是基于 ...
- [CSS]white-space 属性详解
实例 规定段落中的文本不进行换行: p { white-space: nowrap } 可能的值 值 描述 normal 默认.空白会被浏览器忽略. pre 空白会被浏览器保留.其行为方式类似 HTM ...
- hdu 2594 Simpsons’ Hidden Talents KMP应用
Simpsons’ Hidden Talents Problem Description Write a program that, when given strings s1 and s2, fin ...
- hdu 1427 dfs
速算24点 题意:随机给你四张牌,包括 A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*','/'运算符以及括号改变运算 顺序,使得最终 ...
- 软件测试 -- 和用户共同测试(UAT测试)的注意点有哪些
软件产品在投产前,通常都会进行用户验收测试.如果用户验收测试没有通过,直接结果就是那不到“Money”,间接影响是损害了公司的形象,而后者的影响往往更严重.根据作者的经验,用户验收测试一定要让用户满意 ...
- python 内建函数 str() 和 repr() 的区别
1.内建函数str()和repr() 或反引号操作符(``)可以方便地以字符串的方式获取对象的内容.类型.数值属性等信息. 2.str()函数得到的字符串可读性好(故被print调用) 3.repr( ...
- mysql function 与 procedure
Mysql 的 function 和 procedure 有啥区别呢 ? 网上搜索后说 function 有返回值, procedure 无返回值. 1.return 从function 的语法角度 ...
- 如何在Ubuntu Unity上修改应用程序图标
转自如何在Ubuntu Unity上修改应用程序图标 这篇文章将教大家在Ubuntu Unity上修改应用程序图标,这个教程适合于Ubuntu 14.04, Ubuntu 13.10, Ubuntu ...
- CF 279A. Point on Spiral
http://codeforces.com/problemset/problem/279/A 题意 :就是给你一个螺旋形的图,然后给你一个点,问从(0,0)点到这个点需要转几次弯,当然,是按着这个螺旋 ...