【题目】

有一个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. part 36 AngularJS route reload

    In this video we will discuss angular route service reload() method. This method is useful when you ...

  2. Part 29 AngularJS intellisense in visual studio

    In the previous videos if you have noticed as we were typing the angular code in Script.js file we w ...

  3. 大爽Python入门教程 3-3 循环:`for`、`while`

    大爽Python入门公开课教案 点击查看教程总目录 for循环 可迭代对象iterable 不同于其他语言. python的for循环只能用于遍历 可迭代对象iterable 的项. 即只支持以下语法 ...

  4. dart系列之:dart类中的泛型

    目录 简介 为什么要用泛型 怎么使用泛型 类型擦除 泛型的继承 泛型方法 总结 简介 熟悉JAVA的朋友可能知道,JAVA在8中引入了泛型的概念.什么是泛型呢?泛型就是一种通用的类型格式,一般用在集合 ...

  5. JSON实现序列化dump和dumps方法,JSON实现反序列化loads和load方法

    通过文件操作,我们可以将字符串写入到一个本地文件.但是,如果是一个对象(例如列表.字典.元组等),就无 法直接写入到一个文件里,需要对这个对象进行序列化,然后才能写入到文件里. 设计一套协议,按照某种 ...

  6. 菜鸡的Java笔记 笔记

    // 雇员编号 姓名 职位 基本工资 佣金等信息 package study; class Enr{ private int number; // 编号 private String fullName ...

  7. SpringCloud升级之路2020.0.x版-38. 实现自定义 WebClient 的 NamedContextFactory

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 实现 WeClient 的 NamedContextFactory 我们要实现的是不同微服 ...

  8. [bzoj1071]组队

    题目即要求$Ah+Bv<=C+Aminh+Bminv$,如果同时枚举minh和minv,那么即要求$minh\le h$,$minv\le v$且$s\le C+Aminh+Bminv$从小到大 ...

  9. Java设计模式之(七)——装饰器模式

    1.什么是装饰器模式? Attach additional responsibilities to an object dynamically keeping the same interface.D ...

  10. 解决FastJson中"$ref重复引用"的问题方法

    对象的引用重复使用造成了重复引用问题,Fastjson默认开启引用检测将相同的对象写成引用的形式: 1 2 3 4 5 {"$ref": "$"} // 引用根 ...