第七届蓝桥杯C/C++程序设计本科B组决赛 ——棋子换位(代码补全题)
棋子换位
有n个棋子A,n个棋子B,在棋盘上排成一行。
它们中间隔着一个空位,用“.”表示,比如:
AAA.BBB
现在需要所有的A棋子和B棋子交换位置。
移动棋子的规则是:
1. A棋子只能往右边移动,B棋子只能往左边移动。
2. 每个棋子可以移动到相邻的空位。
3. 每个棋子可以跳过相异的一个棋子落入空位(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)//移动一个棋子A或者B到空位上
{
data[to] = data[from];
data[from] = '.';
} int valid(char* data, int k)//判断是否越界
{
if(k< || k>=strlen(data)) return ;
return ;
} void f(char* data)
{
int i;
int tag;
int dd = ; // 移动方向 while(){
tag = ;
for(i=; i<strlen(data); i++){
if(data[i]=='.') continue;
if(data[i]=='A') dd = ;
if(data[i]=='B') dd = -; 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("jump:%s\n", data);
tag = ;
break;
}
} if(tag) continue; for(i=; i<strlen(data); i++){
if(data[i]=='.') continue;
if(data[i]=='A') dd = ;//向右
if(data[i]=='B') dd = -;//向左 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("move:%s\n", data);
tag = ;
break;
}
} if(tag==) break;
}
} int main()
{
char data[] = "AAA.BBB";
printf("%s\n",data);
f(data);
return ;
}
思路:
以下为程序运行时的输出:
初始:AAA.BBB
move:AA.ABBB
jump:AABA.BB
move:AABAB.B
jump:AAB.BAB
jump:A.BABAB
move:.ABABAB
jump:BA.ABAB
jump:BABA.AB
jump:BABABA.
move:BABAB.A
jump:BAB.BAA
jump:B.BABAA
move:BB.ABAA
jump:BBBA.AA
move:BBB.AAA
仔细想想,还是有规律的;注意看上面的第二行和第三行,从第二行的状态出发,走一次‘B’之后达到了一个状态:空点两侧都是‘B’了,也就是说空地两侧是相同的字符!——这个时候就不能再把最后一个B再向左移动(move)了,不然就卡死了!
下面的几个画横线的都是这样!这种题目确实不好想,解题思路应该进行一些调整,自己按照规则尝试运行运行,在自己模拟的过程中逐步发现规律,毕竟去掉这一行以后经常进入死循环!
第七届蓝桥杯C/C++程序设计本科B组决赛 ——棋子换位(代码补全题)的更多相关文章
- 2016年第七届蓝桥杯C/C++程序设计本科B组决赛
2.答案300 刁丝卫代码,比赛时long long写成int,结果成了263...一等擦肩而过... #include <iostream> #include <fstream&g ...
- 第七届蓝桥杯C/C++程序设计本科B组决赛 ——机器人塔(程序大题)
机器人塔 X星球的机器人表演拉拉队有两种服装,A和B.他们这次表演的是搭机器人塔. 类似: A B B A B A A A B B B B B A BA B A B B A 队内的组塔规则是: A 只 ...
- 第七届蓝桥杯C/C++程序设计本科B组决赛 ——凑平方数(填空题)
凑平方数 把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的.比如:0, 36, 5948721 再比如:10985247361, 25, 63907840, 4, 289, 1 ...
- 2016年第七届蓝桥杯C/C++程序设计本科B组省赛
/* 2016年第七届蓝桥杯C/C++程序设计本科B组省赛 煤球数目(结果填空) 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形) ...
- 2015年第六届蓝桥杯C/C++程序设计本科B组决赛
1.积分之谜(枚举) 2.完美正方形 3.关联账户(并查集) 4.密文搜索 5.居民集会 6.模型染色 1.积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C.为了促销,每件商品都会返固定 ...
- 2015年第六届蓝桥杯C/C++程序设计本科B组决赛 ——居民集会(编程大题)
标题:居民集会 蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的 位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距 离为di.每年,蓝桥村都要举行一次集会.今年,由于村里的 ...
- 2015年第六届蓝桥杯C/C++程序设计本科B组决赛 完美正方形
完美正方形 如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形.历史上,人们花了很久才找到了若干完美正方形.比如:如下边长的22个正方形 2 3 4 6 7 8 12 13 ...
- 2016年第六届蓝桥杯C/C++程序设计本科B组决赛 ——一步之遥(填空题题)
一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里.矿车停在平直的废弃的轨道上.他的面前是两个按钮,分别写着“F”和“B”. 小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退.按F,会 ...
- 2019年第十届蓝桥杯C/C++程序设计本科B组省赛 E迷宫
试题 E: 迷宫 本题总分: 分 [问题描述] 下图给出了一个迷宫的平面图,其中标记为 的为障碍,标记为 的为可 以通行的地方. 迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它 ...
随机推荐
- 基于libuv的TCP设计(三)
基于libuv的TCP设计(一) 基于libuv的TCP设计(二) 一.第二版本的libuv_tcp已经基本可以使用.不会出错与崩溃现象,支持几百路客户端同时连接.可是有一缺陷就占用CPU非常 ...
- String类的构造函数,析构函数、拷贝构造函数和赋值函数
(1)构造函数 String::String(const char *str) { if(str==NULL) { m_data = new char[1]; *m_data = ‘\0’; } el ...
- kafka为什么吞吐量高,怎样保证高可用
1:kafka可以通过多个broker形成集群,来存储大量数据:而且便于横向扩展. 2:kafka信息存储核心的broker,通过partition的segment只关心信息的存储,而生产者只负责向l ...
- 2019秋季PAT甲级_备考总结
2019 秋季 PAT 甲级 备考总结 在 2019/9/8 的 PAT 甲级考试中拿到了满分,考试题目的C++题解记录在这里,此处对备考过程和考试情况做一个总结.如果我的方法能帮助到碰巧点进来的有缘 ...
- python学习-57 logging模块
logging 1.basicConfig方式 import logging # 以下是日志的级别 logging.debug('debug message') logging.info('info ...
- 爬虫探索Chromedriver+Selenium初试
今天分享Python使用Chromedriver+Selenium爬虫的的方法,Chromedriver是一个有意思的爬虫插件,这个插件的爬虫方式主要是完全模拟浏览器点击页面,一步一步去找你要的东西, ...
- Linux磁盘管理系列 — 磁盘配额管理
一.磁盘管理的概念 Linux系统是多用户任务操作系统,在使用系统时,会出现多用户共同使用一个磁盘的情况,如果其中少数几个用户占用了大量的磁盘空间,势必压缩其他用户的磁盘的空间和使用权限.因此,系统管 ...
- C# 窗体淡出淡入效果
[DllImport("user32.dll")] //设置控件出现动画 private static extern bool AnimateWindo ...
- ASP.NET Core利用拦截器 IActionFilter实现权限控制
“麦荻网教系统”采用了前后端代码分离的架构,即“Miidy.Cloud.Console”站与“Miidy.Cloud.Manage”站(两个前端站)同时通过web api的方式调用“Miidy.Clo ...
- Authentication failed for "http://xxxxxx"
1.配置用户信息 git config --global user.name [username] git config --global user.email [email] 2.查询用户信息 ...