UVA227 Puzzle
题目大意是说给你一张图,再给你可能是多行的指令,使你移动空格。如果所有指令合法,输出最后的图。否则,输出。。。
难点:主要在输入。当空格在行末时,getline不会输入空格。
PE点:输入结束后,不打空行
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<map>
#include<stdlib.h>
typedef long long ll;
using namespace std;
const int N=1005;
int cnt;
char cmd[N];
string a[5];
bool judge(int x,int y){
if(x>=5||x<0||y>=5||y<0)return false;
return true;
}
int mov(int x,int y){
for(int i=0;i<cnt-1;i++){
if(cmd[i]=='A'){
if(!judge(x-1,y))return -1;
a[x][y]=a[x-1][y];
a[x-1][y]=' ';
x-=1;
}
if(cmd[i]=='B'){
if(!judge(x+1,y))return -1;
a[x][y]=a[x+1][y];
a[x+1][y]=' ';
x+=1;
}
if(cmd[i]=='L'){
if(!judge(x,y-1))return -1;
a[x][y]=a[x][y-1];
a[x][y-1]=' ';
y-=1;
}
if(cmd[i]=='R'){
if(!judge(x,y+1))return -1;
a[x][y]=a[x][y+1];
a[x][y+1]=' ';
y+=1;
}
//cout<<x<<" "<<y<<endl;
}
return 0;
}
int main()
{
int kase=0;
while(getline(cin,a[0])){
if(a[0][0]=='Z')break;
for(int i=1;i<5;i++){getline(cin,a[i]);}
int x=0,y=0;
//cin>>s;cout<<s<<endl;cout<<endl;
//cin.clear();cin.sync();
for(int i=0;i<5;i++){
if(a[i].length()==4){
x=i;y=4;a[i][4]=' ';
break;
}
for(int j=0;j<5;j++){
if(a[i][j] == ' '){
x=i;y=j;
break;
}
}
}
//cout<<x<<" "<<y<<endl;
cnt=0;
while(scanf("%c",&cmd[cnt])){
if(cmd[cnt]=='\n')continue;
if(cmd[cnt++]=='0')break;
}
getchar();
//cout<<x<<" "<<y<<endl;
if(kase)printf("\n");
printf("Puzzle #%d:\n",++kase);
int f=mov(x,y);
if(f<0)printf("This puzzle has no final configuration.\n");
else {
for(int i=0;i<5;i++){
printf("%c",a[i][0]);
for(int j=1;j<5;j++){
printf(" %c",a[i][j]);
}
puts("");
}
}
}
return 0;
}