【题目】

有一个5*5的网络,恰好有一个格子是空的(空格),其他格子各有一个字母。

指令:A, B, L, R 把空格上、下、左、右的相邻字母移到空格中。

【输入】

初始网格和指令序列(以数字0结束)。

【输出】

指令执行完毕后的网格。

如果有非法指令,输出"This puzzle has no final configuration."。

【知识点】

  1. scanf输入带空格的输入,scanf的多次使用

    https://www.cnblogs.com/kinologic/p/13957927.html

  2. 二维数组的传参方式

    https://www.cnblogs.com/kinologic/p/13958685.html

    我这里用了文章中的第二种方式。第一种方式和第二种方式都还比较简单。第三种方法要用到二级指针了,略显复杂。

    首先是在主函数中定义了二维数组:



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

  3. switch-case分支语句一定要写break!

    break的作用是结束当前的switch语句,如果删去,则程序将会从第一个匹配的case开始执行语句,直到其下面的所有语句都执行完毕才会退出switch。

  4. 多组数据的返回

    刚开始写的时候脑子不太好用,看有用结构体/传指针的方式。

    但是后来意识到有小题大做了,其实直接用C++引用传int的引用就行了。

  5. 二维数组的坐标

    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 谜题/算法竞赛入门经典/数组和字符串的更多相关文章

  1. 【C/C++】习题3-4 周期串/算法竞赛入门经典/数组和字符串

    [题目] 如果某个字符串可以由长度为k的字符串重复多次得到,则称该串以k为周期. 输入一个长度不超过80的字符串,输出最小周期. [思路] 暴力求解.依次考察周期1~长度n. 筛选:周期一定是长度n的 ...

  2. 【C/C++】习题3-3 数数字/算法竞赛入门经典/数组和字符串

    [题目] 把前n个(n<=10000)的整数顺序写在一起:123456789101112-- 数一数0~9各出现多少次(输出10个整数,分别是0,1,2,--,9出现的次数) [解答] 暴力求解 ...

  3. 【C/C++】习题3-7 DNA/算法竞赛入门经典/数组与字符串

    [题目] 输入m组n长的DNA序列,要求找出和其他Hamming距离最小的那个序列,求其与其他的Hamming距离总和. 如果有多个序列,求字典序最小的. [注]这道题是我理解错误,不是找出输入的序列 ...

  4. 【C/C++】例题3-6 环状序列/算法竞赛入门经典/数组和字符串

    [字典序比较] 对于两个字符串,比较字典序,从第一个开始,如果有两位不一样的出现,那么哪个的ASCII码小,就是字典序较小.如果都一样,那么短的小. [题目] 输入一个环状串,输出最小的字典序序列. ...

  5. 【C/C++】例题3-5 生成元/算法竞赛入门经典/数组与字符串

    [题目] x+x的各位数之和为y,x为y的生成元. 求10万以内的n的最小生成元,无解输出0. [解答] 这是我根据自己的想法最初写的代码: #include<cstdio> #inclu ...

  6. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  7. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  8. [刷题]算法竞赛入门经典 3-12/UVa11809

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa11809:Floating-Point Numbers 代码: //UVa11 ...

  9. [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-10/UVa1587:Box 代码: //UVa1587 - Box #include&l ...

随机推荐

  1. Go语言核心36讲(Go语言实战与应用三)--学习笔记

    25 | 更多的测试手法 在本篇文章,我会继续为你讲解更多更高级的测试方法.这会涉及testing包中更多的 API.go test命令支持的,更多标记更加复杂的测试结果,以及测试覆盖度分析等等. 前 ...

  2. 设计模式学习-使用go实现外观模式

    外观模式 定义 适用范围 代码实现 优点 缺点 关于接口粒度的思考 参考 外观模式 定义 外观模式也叫门面模式 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接 ...

  3. Android Activity Deeplink启动来源获取源码分析

    一.前言 目前有很多的业务模块提供了Deeplink服务,Deeplink简单来说就是对外部应用提供入口. 针对不同的跳入类型,app可能会选择提供不一致的服务,这个时候就需要对外部跳入的应用进行区分 ...

  4. [luogu7476]苦涩

    维护线段树,在其每一个节点上维护一个set(可重),以及子树内所有set的最大值 考虑下传标记,如果将所有元素全部下传复杂度显然不正确,但注意到我们仅关心于其中的最大值,即仅需要将最大值下传即可 其有 ...

  5. [cf1479D]Odd Mineral Resource

    先考虑判定是否有解,注意到无解即每一个数都出现偶数次,根据异或的性质,只需要随机$V_{i}$,假设$u$到$v$路径上所有节点构成集合$S$,若$\bigoplus_{x\in S,l\le a_{ ...

  6. 理解ASP.NET Core - 过滤器(Filters)

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 Filter概览 如果你是从ASP.NET一路走过来的,那么你一定对过滤器(Filter)不陌 ...

  7. 洛谷 P3215 [HNOI2011]括号修复 / [JSOI2011]括号序列(fhq-treap)

    题目链接 题意:有一个长度为 \(n\) 的括号序列,你需要支持以下操作: 将 \([l,r]\) 中所有括号变为 \(c\) 将 \([l,r]\) 区间翻转 将 \([l,r]\) 区间中左括号变 ...

  8. 洛谷 P5400 - [CTS2019]随机立方体(组合数学+二项式反演)

    洛谷题面传送门 二项式反演好题. 首先看到"恰好 \(k\) 个极大值点",我们可以套路地想到二项式反演,具体来说我们记 \(f_i\) 为钦定 \(i\) 个点为极大值点的方案数 ...

  9. Navicat 激活教程2021(Linux)

    Navicat 激活教程2021(Linux) 目录 背景 环境 激活 清理 使用 背景 Navicat 是香港卓软数字科技有限公司生产的一系列 MySQL.MariaDB.MongoDB.Oracl ...

  10. 全基因组选择育种(GS)简介

    全基因组选择(Genomic selection, GS)是一种利用覆盖全基因组的高密度标记进行选择育种的新方法,可通过早期选择缩短世代间隔,提高育种值(Genomic Estimated Breed ...