2016年第七届蓝桥杯C/C++ B组国赛 —— 第三题:棋子换位
棋子换位
有n个棋子A,n个棋子B,在棋盘上排成一行。
它们中间隔着一个空位,用“.”表示,比如:
AAA.BBB
现在需要所有的A棋子和B棋子交换位置。
移动棋子的规则是:
- A棋子只能往右边移动,B棋子只能往左边移动。
- 每个棋子可以移动到相邻的空位。
- 每个棋子可以跳过相异的一个棋子落入空位(A跳过B或者B跳过A)。
AAA.BBB 可以走法:
移动A ==> AA.ABBB
移动B ==> AAAB.BB
跳走的例子:
AA.ABBB ==> AABA.BB
以下的程序完成了AB换位的功能,请仔细阅读分析源码,填写划线部分缺失的内容。
#include <stdio.h>
#include <string.h>void move(char* data, int from, int to)
{data[to] = data[from];data[from] = '.';
}int valid(char* data, int k)
{if(k<0 || k>=strlen(data)) return 0;return 1;
}void f(char* data)
{int i;int tag;int dd = 0; // 移动方向while(1){tag = 0;for(i=0; i<strlen(data); i++){if(data[i]=='.') continue;if(data[i]=='A') dd = 1;if(data[i]=='B') dd = -1;if(valid(data, i+dd) && valid(data,i+dd+dd) && data[i+dd]!=data[i] && data[i+dd+dd]=='.'){ //如果能跳... move(data, i, i+dd+dd);printf("%s\n", data);tag = 1;break;}}if(tag) continue;for(i=0; i<strlen(data); i++){if(data[i]=='.') continue;if(data[i]=='A') dd = 1;if(data[i]=='B') dd = -1; if(valid(data, i+dd) && data[i+dd]=='.'){ // 如果能移动...if( ______________________ ) continue; //填空位置 move(data, i, i+dd);printf("%s\n", data);tag = 1;break;}}if(tag==0) break; }
}int main()
{char data[] = "AAA.BBB"; f(data);return 0;
}
注意:只提交划线部分缺少的代码,不要复制已有代码或填写任何多余内容。
Code
/*^....0^ .1 ^1^.. 011.^ 1.0^ 1 ^ ^0.11 ^ ^..^0. ^ 0^.0 1 .^.1 ^0 .........001^.1 1. .111100....01^00 11^ ^1. .1^1.^ ^0 0^.^ ^0..1.1 1..^1 .0 ^ ^00. ^^0.^^ 0 ^^110.^0 0 ^ ^^^10.01^^ 10 1 1 ^^^1110.101 10 1.1 ^^^1111110010 01 ^^ ^^^1111^1.^ ^^^10 10^ 0^ 1 ^^111^^^0.1^ 1....^11 0 ^^11^^^ 0.. ....1^ ^ ^1. 0^ ^11^^^ ^ 1 111^ ^ 0.10 00 11 ^^^^^ 1 0 1.0^ ^0 ^0 ^^^^ 0 0.0^ 1.0 .^ ^^^^ 1 1 .0^.^ ^^ 0^ ^1 ^^^^ 0. ^.11 ^ 11 1. ^^^ ^ ^ ..^^..^ ^1 ^.^ ^^^ .0 ^.00..^ ^0 01 ^^^ .. 0..^1 .. .1 ^.^ ^^^ 1 ^ ^0001^ 1. 00 0. ^^^ ^.0 ^.1. 0^. ^.^ ^.^ ^^^ ..0.01 .^^. .^ 1001 ^^ ^^^ . 1^. ^ ^. 11 0. 1 ^ ^^ 0.0 ^. 0 ^0 1 ^^^ 0.0.^ 1. 0^ 0 .1 ^^^ ...1 1. 00 . .1 ^^^ ..1 1. ^. 0 .^ ^^ ..0. 1. .^ . 0 ..1 1. 01 . . ^ 0^.^ 00 ^0 1. ^ 1 1.0 00 . ^^^^^^ ..^ 00 01 ..1. 00 10 1 ^^.1 00 ^. ^^^ .1.. 00 .1 1..01 ..1.1 00 1. ..^ 10^ 1^ 00 ^.1 0 1 1.1 00 00 ^ 1 ^. 00 ^.^ 10^ ^^1.1 00 00 10^..^ 1. ^. 1.0 1 ^. 00 00 .^^ ^. ^ 1 00 ^0000^ ^ 011 0 ^. 00.0^ ^00000 1.00.1 11. 1 0 1^^0.01 ^^^ 01.^ ^ 1 1^^ ^.^1 1 0... 1 ^1 1^ ^ .01 ^ 1.. 1.1 ^0.0^ 0 1..01^^100000..0^1 1 ^ 1 ^^1111^ ^^0 ^ ^ 1 1000^.1 ^.^ . 00.. 1.1 0. 01. . 1. .^1. 1 1. ^0^ . ^.1 00 01^.0 001. .^*/
// VB_king —— 2016_Finals_B_C++_3.cpp created by VB_KoKing on 2019-05-19:23.
/* Procedural objectives:Variables required by the program:Procedural thinking:程序的第一个循环处理的是可以跳的情况,第二个循环处理的是可以走的情况,而在while循环中都是先把能跳的处理完之后在处理能走的;需要填空的地方代表可以走但是不走的情况,对比源程序走法和正确走法:源程序走法为:
AA.ABBB
AABA.BB
AAB.ABB
A.BAABB
.ABAABB
BA.AABB
B.AAABB 正确的走法为:
AA.ABBB
AABA.BB
AABAB.B
AAB.BAB
A.BABAB
.ABABAB
BA.ABAB
BABA.AB
BABABA.
BABAB.A
BAB.BAA
B.BABAA
BB.ABAA
BBBA.AA
BBB.AAA这个规律比较诡异,当左右两边的字母不相同("."不算在内)时,可以移动的那个字母;当左右两边的字母相同时,可以移动但不要移动。Functions required by the program:Determination algorithm:Determining data structure:*/
/* My dear Max said:
"I like you,
So the first bunch of sunshine I saw in the morning is you,
The first gentle breeze that passed through my ear is you,
The first star I see is also you.
The world I see is all your shadow."FIGHTING FOR OUR FUTURE!!!
*/
#include <stdio.h>
#include <string.h>void move(char* data, int from, int to)
{data[to] = data[from];data[from] = '.';
}int valid(char* data, int k)
{if(k<0 || k>=strlen(data)) return 0;return 1;
}void f(char* data)
{int i;int tag;int dd = 0; // 移动方向while(1){tag = 0;for(i=0; i<strlen(data); i++){if(data[i]=='.') continue;if(data[i]=='A') dd = 1;if(data[i]=='B') dd = -1;if(valid(data, i+dd) && valid(data,i+dd+dd)&& data[i+dd]!=data[i] && data[i+dd+dd]=='.'){//如果能跳...move(data, i, i+dd+dd);printf("%s\n", data);tag = 1;break;}}if(tag) continue;for(i=0; i<strlen(data); i++){if(data[i]=='.') continue;if(data[i]=='A') dd = 1;if(data[i]=='B') dd = -1;if(valid(data, i+dd) && data[i+dd]=='.'){// 如果能移动...if(valid(data, i+dd+dd) && (valid(data,i-dd)) && data[i+dd+dd] == data[i-dd]) continue;move(data, i, i+dd);printf("%s\n", data);tag = 1;break;}}if(tag==0) break;}
}int main()
{char data[] = "AAA.BBB";f(data);return 0;
}
2016年第七届蓝桥杯C/C++ B组国赛 —— 第三题:棋子换位相关推荐
- 2016年第七届蓝桥杯C/C++ A组国赛 —— 第三题:打靶
打靶 小明参加X星球的打靶比赛. 比赛使用电子感应计分系统.其中有一局,小明得了96分. 这局小明共打了6发子弹,没有脱靶. 但望远镜看过去,只有3个弹孔. 显然,有些子弹准确地穿过了前边的弹孔. 不 ...
- 2016年第七届蓝桥杯C/C++ C组国赛 —— 第二题:反幻方
反幻方 我国古籍很早就记载着 2 9 4 7 5 3 6 1 8 这是一个三阶幻方.每行每列以及对角线上的数字相加都相等. 下面考虑一个相反的问题. 可不可以用 1~9 的数字填入九宫格. 使得:每行 ...
- 2016年第七届蓝桥杯C/C++ A组国赛 —— 第一题:随意组合
标题:随意组合 小明被绑架到X星球的巫师W那里. 其时,W正在玩弄两组数据 (2 3 5 8) 和 (1 4 6 7) 他命令小明从一组数据中分别取数与另一组中的数配对,共配成4对(组中的每个数必被用 ...
- 2016年第七届蓝桥杯C/C++ B组国赛 —— 第一题:一步之遥
标题:一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的面前是两个按钮,分别写着"F"和"B". 小明突然记起来, ...
- 2015年第六届蓝桥杯C/C++ A组国赛 —— 第三题:显示二叉树
标题:显示二叉树 排序二叉树的特征是: 某个节点的左子树的所有节点值都不大于本节点值. 某个节点的右子树的所有节点值都不小于本节点值. 为了能形象地观察二叉树的建立过程,小明写了一段程序来显示出二叉树 ...
- 2018年第九届蓝桥杯C/C++ C组国赛 —— 第三题:全排列
标题:全排列 对于某个串,比如:"1234",求它的所有全排列. 并且要求这些全排列一定要按照字母的升序排列. 对于"1234",应该输出(一共4!=24行): ...
- 2016年第七届蓝桥杯C/C++B组省赛题目解析
题目1:煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有多少 ...
- 2019第十届蓝桥杯C/C++ A组省赛 —— 第三题: 最大降雨量
试题 C: 最大降雨量 本题总分:10 分 [问题描述] 由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨. 这个法术需要用到他手中的 49 张法术符,上面分别写着 1 至 49 这 49 ...
- 2015年第六届蓝桥杯C/C++ A组国赛 —— 第五题:切开字符串
标题:切开字符串 Pear有一个字符串,不过他希望把它切成两段. 这是一个长度为N(<=10^5)的字符串. Pear希望选择一个位置,把字符串不重复不遗漏地切成两段,长度分别是t和N-t(这两 ...
最新文章
- 用metfanzi识别文字
- 教师招聘要求计算机证,长沙市直教师招聘考试没有计算机证能考么?
- 2004-5-12+ 用DataSet实现分页
- Angularjs编写KindEditor,UEidtor指令
- 解决yum [Errno 256] No more mirrors to try
- virtualbox报错:Failed, trying without DKMS的解决方案
- pytorch: MaxUnpool2d 与 Upsampling
- 基于springboot的猫头鹰物业管理系统
- 算法笔记:Dinic最大流和SPFA费用流
- php 转gbk,php 中文怎么转gbk
- 低代码平台表单引擎技术方案选型
- Java 响应对象详解
- 21cn企业邮箱服务器端口号,21cn企业邮箱手机客户端设置--Android
- 第一次面试(厦门西联电子)
- java中如何在键盘中输入一串以逗号隔开数字然后存入数组中,并输出。
- 如何在大屏幕上滚动播放视频、图片和文字
- PTGUI 720 制作全景图
- 奇安信VS启明星辰 欲上市“新人”与上市“老手”的全面对比
- 阿甘修理机器人cd_【补偿】遗失的美好~
- easypr arm linux,arm linux下交叉編譯EasyPR中文車牌識別系統開發(一)
热门文章
- python之ORM操作
- linux经常使用解压缩命令
- 产品经理如何量化关键需求指标
- VC++ 中 try-catch-finally 语句 如何在获取正常信息是写一些操作语句
- ExtJS:鼠标移出菜单后菜单自动隐藏
- 海思芯片硬件java加速_海思Hi3719C V100芯片简介
- linux定位so快捷方式_Linux动态库(.so)搜索路径 | 学步园
- Java黑皮书课后题第11章:11.3(Account类的子类)在编程练习题9.7中定义了一个Account类来对一个银行账户建模。一个账户有账号、余额、年利率、开户日期等属性,以及存款和取款等方法
- Java黑皮书课后题第2章:*2.17(科学:风寒温度)外面有多冷?...twc=35.74+0.6215ta-35.75v0.16+0.4275tav0.16,输入度数、风速显示风寒温度
- C语言学习之从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)