【C/C++】习题3-5 谜题/算法竞赛入门经典/数组和字符串
【题目】
有一个5*5的网络,恰好有一个格子是空的(空格),其他格子各有一个字母。
指令:A, B, L, R 把空格上、下、左、右的相邻字母移到空格中。
【输入】
初始网格和指令序列(以数字0结束)。
【输出】
指令执行完毕后的网格。
如果有非法指令,输出"This puzzle has no final configuration."。
【知识点】
scanf输入带空格的输入,scanf的多次使用
https://www.cnblogs.com/kinologic/p/13957927.html二维数组的传参方式
https://www.cnblogs.com/kinologic/p/13958685.html
我这里用了文章中的第二种方式。第一种方式和第二种方式都还比较简单。第三种方法要用到二级指针了,略显复杂。
首先是在主函数中定义了二维数组:

其次是在子函数中的引用:

switch-case分支语句一定要写break!
break的作用是结束当前的switch语句,如果删去,则程序将会从第一个匹配的case开始执行语句,直到其下面的所有语句都执行完毕才会退出switch。多组数据的返回
刚开始写的时候脑子不太好用,看有用结构体/传指针的方式。
但是后来意识到有小题大做了,其实直接用C++引用传int的引用就行了。二维数组的坐标
a[x][y]
x是行,y是列
修改行:x 上- 下+
修改列:y 左- 右+
【代码】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
const int maxn = 100;
using namespace std;
void alert()
{
printf("This puzzle has no congiruation\n");
}
void show_matrix(char(*a)[10])
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%c", a[i][j]);
}
printf("\n");
}
}
void get_empty(char(*a)[10], int& x, int& y) //由于对值由修改,必须传引用
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (a[i][j] == ' ') //if后面两句要打括号,不然只会执行一句
{
x = i;
y = j;
}
}
}
}
void move_empty(char c, char(*a)[10], int& x, int& y) //对值没有修改,不传引用也可以
{
switch(c)
{
case 'A': //把空格上方的相邻字母移到空格中
{
if (x == 0) alert();
else
{
a[x][y] = a[x-1][y];
a[x-1][y] = ' ';
}
}
break;
case 'B': //把空格下方的相邻字母移到空格中
{
if (x == 4) alert();
else
{
a[x][y] = a[x+1][y];
a[x+1][y] = ' ';
}
}
break;
case 'L': //把空格左方的相邻字母移到空格中
{
if (y == 0) alert();
else
{
a[x][y] = a[x][y-1];
a[x][y-1] = ' ';
}
}
break;
case 'R': //把空格右方的相邻字母移到空格中
{
if (y == 4) alert();
else
{
a[x][y] = a[x][y+1];
a[x][y+1] = ' ';
}
}
break;
}
}
int main()
{
char s[maxn]; //暂存用
char a[10][10]; //存储题目矩阵,a是二维数组(二级指针)
//坐标参数指针
int x = 0, y = 0; //位置坐标
//输入题目矩阵:五行输入 带空格
for (int i = 0; i < 5; i++)
{
scanf("%[^\n]",s);
for (int j = 0; j < 5; j++)
{
a[i][j] = s[j];
}
fflush(stdin);
}
//printf("out\n");
//show_matrix(a);
//输入指令序列
fflush(stdin);
scanf("%s",s);
int n = strlen(s);
//检测是否为合法指令
int flag = 1;
for (int i = 0; i < n-1; i++)
{
if(s[i] != 'A' && s[i] != 'B' && s[i] != 'L' && s[i] != 'R') //用“或”有错误
{
flag = 0;
break;
}
}
//printf("1flag %d\n",flag);
if ( s[n-1] != '0' ) flag = 0;
//printf("2flag %d\n",flag);
if (flag == 0) alert();
//若为合法指令
else
{
for (int i = 0; i < n-1; i++)
{
get_empty(a, x, y);
printf("empty: x is %d, y is %d\n", x, y);
move_empty(s[i], a, x, y); //执行命令
}
show_matrix(a);
}
system("pause");
}
【心得】
C的指针真是太麻烦了,用不起就用C++的引用(
【C/C++】习题3-5 谜题/算法竞赛入门经典/数组和字符串的更多相关文章
- 【C/C++】习题3-4 周期串/算法竞赛入门经典/数组和字符串
[题目] 如果某个字符串可以由长度为k的字符串重复多次得到,则称该串以k为周期. 输入一个长度不超过80的字符串,输出最小周期. [思路] 暴力求解.依次考察周期1~长度n. 筛选:周期一定是长度n的 ...
- 【C/C++】习题3-3 数数字/算法竞赛入门经典/数组和字符串
[题目] 把前n个(n<=10000)的整数顺序写在一起:123456789101112-- 数一数0~9各出现多少次(输出10个整数,分别是0,1,2,--,9出现的次数) [解答] 暴力求解 ...
- 【C/C++】习题3-7 DNA/算法竞赛入门经典/数组与字符串
[题目] 输入m组n长的DNA序列,要求找出和其他Hamming距离最小的那个序列,求其与其他的Hamming距离总和. 如果有多个序列,求字典序最小的. [注]这道题是我理解错误,不是找出输入的序列 ...
- 【C/C++】例题3-6 环状序列/算法竞赛入门经典/数组和字符串
[字典序比较] 对于两个字符串,比较字典序,从第一个开始,如果有两位不一样的出现,那么哪个的ASCII码小,就是字典序较小.如果都一样,那么短的小. [题目] 输入一个环状串,输出最小的字典序序列. ...
- 【C/C++】例题3-5 生成元/算法竞赛入门经典/数组与字符串
[题目] x+x的各位数之和为y,x为y的生成元. 求10万以内的n的最小生成元,无解输出0. [解答] 这是我根据自己的想法最初写的代码: #include<cstdio> #inclu ...
- (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO
http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...
- 算法竞赛入门经典+挑战编程+USACO
下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...
- [刷题]算法竞赛入门经典 3-12/UVa11809
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa11809:Floating-Point Numbers 代码: //UVa11 ...
- [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-10/UVa1587:Box 代码: //UVa1587 - Box #include&l ...
随机推荐
- 微信小程序(八)
应用弹性盒子布局 基于 flexbox layout 的实现 先变为 flexbox layout display: flex; 从上往下 flex-direction: column; 均匀分布,居 ...
- [noi37]列队
直接统计答案,令dp[i][j]表示前i个数最长的颜色各不相同后缀长度为j的方案数,如果一直令j<m,那么就相当于统计了方案数. 如何推出dp[i][j]呢?考虑i-1的最长前缀是多少:当小于j ...
- [atAGC045E]Fragile Balls
构造一张有向图$G=([1,n],\{(a_{i},b_{i})\})$(可以有重边和自环),定义其连通块为将其看作无向图(即边无向)后分为若干个连通块 记$in_{i}$为$i$的入度(即最终盒子中 ...
- [loj3364]植物比较
结论:设$b_{i}$满足该限制,则$a_{i}$合法当且仅当$\forall i\ne j,a_{i}\ne a_{j}$且$\forall |i-j|<k,[a_{i}<a_{j}]= ...
- Java 插入html字符串到PPT幻灯片
通过Java后端代码操作PPT幻灯片时,可直接在幻灯片中绘制形状,并在形状中添加文本字符串内容.本篇文章,介绍一种通过html字符串来添加内容到PPT幻灯片的的方法,可添加文字.图片.视频.音频等.下 ...
- 解决springboot启动日志异常问题
问题描述:springboot启动异常,启动后没有日志打印. 问题原因:slf4j日志实现重复,找不到对应实现类. 问题应对: 1. 是不是项目没起来---->打印的日志数据,到这里就不打印了, ...
- html+css第四篇
浮动 float浮动: 1.块在一排显示 2.内联支持宽高 3.默认内容撑开宽度 4.脱离文档流 5.提升层级半层 float:left | right | none | inherit; 文档流是文 ...
- Codeforces 516E - Drazil and His Happy Friends(同余最短路)
Codeforces 题面传送门 & 洛谷题面传送门 首先思考一个非常简单的性质:记 \(d=\gcd(n,m)\),那么每次在一起吃完饭的男女孩编号必定与 \(d\) 同余,而根据斐蜀定理可 ...
- Codeforces Round #732 (Div.1) 题解
实在是打击人信心的一场比赛啊--一不注意就掉了 50+ 分,rating 没了啊/ll/dk/wq/kk A Weak pretest!!!!!11 /fn/fn/fn 一个很显然的注意点是在交换前后 ...
- Codeforces 870F - Path(数论+分类讨论+正难则反)
Codeforces 题目传送门 & 洛谷题目传送门 首先考虑 \(d(u,v)\) 是个什么东西,分情况讨论: \(u\not\perp v\),\(d(u,v)=1\) \(u\perp ...