算法入门经典第三章习题(2)
2017-08-28 21:19
260 查看
(5)拼图问题
输入:一个包括一个空格的5*5数组,紧接着的一行是对其进行的操作, 以0结束,输入有多轮,以
字符Z结束
操作:
A:将空格上方的字符移到空格里 B:将空格下方的字符移到空格里
L: 将空格左边的字符移到空格里 R: 将空格右边的字符移到空格里
输出:进行操作后的数组,如果操作有误,例如输入A时,空格左边没有元素,则输出无解
//为方便观察,下列代码片中用*代替题目中的空格
Sample Input
TRGSJ
XDOKI
M*VLN
WPABE
UQHCF
ARRBBL0
ABCDE
FGHIJ
KLMNO
PQRS*
TUVWX
AAA
LLLL0
ABCDE
FGHIJ
KLMNO
PQRS*
TUVWX
AAAAABBRRRLL0
Z
Sample Output
Puzzle #1:
T R G S J
X O K L I
M D V B N
W P A E
U Q H C F
Puzzle #2:
A B C D
F G H I E
K L M N J
P Q R S O
T U V W X
Puzzle #3:
This puzzle has no final configuration.
此题思路不是很难,但是需要注意在输入输出细节
思路:输入数组时找到该空格加以标记,运用C++STL中的swap函数完成相应的移动操作,不过需要
注意对违规操作进行标记
本题需要注意的几个点:
(1)输入数组时不能用cin输入,因为cin会自动过滤空格,导致输出结果不正确
而用getchar输入时需要注意读入回车,不然很容易造成错误
(2)由于a[0][0]需要被作为循环是否终止的判断条件,故要单独输入,在读取数组时不能再读取
a[0][0]
输入:一个包括一个空格的5*5数组,紧接着的一行是对其进行的操作, 以0结束,输入有多轮,以
字符Z结束
操作:
A:将空格上方的字符移到空格里 B:将空格下方的字符移到空格里
L: 将空格左边的字符移到空格里 R: 将空格右边的字符移到空格里
输出:进行操作后的数组,如果操作有误,例如输入A时,空格左边没有元素,则输出无解
//为方便观察,下列代码片中用*代替题目中的空格
Sample Input
TRGSJ
XDOKI
M*VLN
WPABE
UQHCF
ARRBBL0
ABCDE
FGHIJ
KLMNO
PQRS*
TUVWX
AAA
LLLL0
ABCDE
FGHIJ
KLMNO
PQRS*
TUVWX
AAAAABBRRRLL0
Z
Sample Output
Puzzle #1:
T R G S J
X O K L I
M D V B N
W P A E
U Q H C F
Puzzle #2:
A B C D
F G H I E
K L M N J
P Q R S O
T U V W X
Puzzle #3:
This puzzle has no final configuration.
此题思路不是很难,但是需要注意在输入输出细节
思路:输入数组时找到该空格加以标记,运用C++STL中的swap函数完成相应的移动操作,不过需要
注意对违规操作进行标记
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int main(){ char a[10][10],b; int turn=0; while((a[0][0]=getchar())!='Z'){ turn++; //游戏轮数 int x,y,flag=1; //x,y用来记录空格的坐标;flag标记移动是否违规 for(int i=0;i<5;i++){ for(int j=0;j<5;j++){ if(!i&&!j)continue;//a[0][0]已经输入过 a[i][j]=getchar(); if(a[i][j]==' '){x=i;y=j;} //找到空格位置 } getchar(); //读入回车 } while((b=getchar())!='0'){ //flag为0代表违规,跳出循环 if(b=='A'){if(x==0){flag=0;break;}swap(a[x][y],a[x--][y]);} if(b=='B'){if(x==4){flag=0;break;}swap(a[x][y],a[x++][y]);} if(b=='L'){if(y==0){flag=0;break;}swap(a[x][y],a[x][y--]);} if(b=='R'){if(y==4){flag=0;break;}swap(a[x][y],a[x][y++]);} } getchar(); //读入回车 cout<<"Puzzle #"<<turn<<":"<<endl; if(flag==1){ for(int i=0;i<5;i++) for(int j=0;j<5;j++) printf(j==4?"%c\n":"%c ",a[i][j]); } else cout<<"This puzzle has no final configuration."<<endl; } return 0; }
本题需要注意的几个点:
(1)输入数组时不能用cin输入,因为cin会自动过滤空格,导致输出结果不正确
而用getchar输入时需要注意读入回车,不然很容易造成错误
(2)由于a[0][0]需要被作为循环是否终止的判断条件,故要单独输入,在读取数组时不能再读取
a[0][0]
相关文章推荐
- 算法入门经典第三章课后习题
- 数据挖掘概念与技术(原书第三版)范明 孟小峰译-----第三章课后习题答案
- 算法竞赛入门经典 第三章 习题
- Python核心编程-第三章习题
- 《快学Scala》第三章习题解答
- 第三章习题
- 算法竞赛入门经典第二版第三章习题
- 编程珠玑之第三章习题2
- 编程珠玑第三章习题3.7(5-8)
- 数据库系统原理教程 第三章 SQL语言 习题集
- C++Primer第三章习题(1)
- 第三章习题3--第五题求1到20的阶乘的和
- 王爽汇编第三章 习题解答
- 第三章部分习题
- 《算法竞赛入门经典》第三章习题3-4
- 数据结构与算法分析课后习题第三章(4)
- 统计建模与R软件第三章习题…
- java程序设计基础_陈国君版第五版_第三章习题
- 《UNIX 网络编程》 第三章课后习题第三题
- 刷紫书第三章习题(习题3-1到习题3-6)