紫书 第三章 Puzzle
Tips
输入时 , 整行读入并根据字符个数判断
输出时 , 每个测试之间两个空格
当用while(getline(cin,s)和cin>>tmp的时候 , 一个神奇的地方是 :
cin读取时会留下回车
因此用cin读取tmp后 , tmp后的回车保留 , 进而导致getline读取到空回车 , 然后就会导致s[0]变为0
需要用continue语句继续(或者getchar)
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long int
inline int read() {
int ans = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')f = -1;
ch = getchar();
}
while (ch <= '9' && ch >= '0') {
ans = ans * 10 + ch - '0';
ch = getchar();
}
return ans * f;
}
void print(vector<string> s) {
for (int i = 0; i< 5; i++) {
for (int j = 0; j< 5; j++) {
cout<<s[i][j]<<" \n"[j==4];
}
}
}
signed main() {
int cnt = 0;
int cur = 0;
vector<string>s(5);
while (getline(cin,s[0])) {
if (s[0][0]=='Z')
break;
if (s[0] =="")
continue;
for (int i = 1; i<= 4; i++) {
getline(cin,s[i]);
}
int x=0,y=0;
for (int i = 0; i< 5; i++) {
for (int j = 0; j< 5; j++) {
if ( j >= s[i].size()||s[i][j] ==' ' )
x = i,y=j;
}
while (s[i].size() < 5)
s[i].push_back(' ');
}
string sen,tmp;
do{
cin>>tmp;
sen += tmp;
} while (sen.back()!='0');
bool f = false;
for (int i =0 ; i< sen.size()-1; i++) {
switch (sen[i]) {
case 'L': {
if (y -1 < 0 ) {
f = true;
break;
}
swap(s[x][y-1],s[x][y]);
y--;
break;
}
case 'R': {
if (y + 1 >= 5) {
f = true;
break;
}
swap(s[x][y+1],s[x][y]);
y ++;
break;
}
case 'A': {
if (x-1 <0) {
f =true;
break;
}
swap(s[x-1][y],s[x][y]);
x--;
break;
}
case 'B': {
if (x+1>=5) {
f= true;
break;
}
swap(s[x+1][y],s[x][y]);
x++;
break;
}
default: break;
}
if (f)
break;
}
if (cnt)
cout<<"\n";
cout<<"Puzzle #"<<++cnt<<":\n";
if (f)cout<<"This puzzle has no final configuration.\n";
else print(s);
}
return 0;
}
/*
TRGSJ
XDOKI
M VLN
WPABE
UQHCF
ARRBBL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAA
LLLL0
ABCDE
FGHIJ
KLMNO
PQRS
TUVWX
AAAAABBRRRLL0
Z
*/

浙公网安备 33010602011771号