您的位置:首页 > 其它

算法入门经典第三章习题(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函数完成相应的移动操作,不过需要

注意对违规操作进行标记

#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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: