Puzzle UVA - 227
题目大意
开始有一个5 * 5的网格,其中有一个格子是空的也就是空格键,其余都是字母,A->空格向上走;B->向下走;L->向左走;R->向右走,先输出"Puzzle #X:",越界就输出"This puzzle has no final configuration.",如果没有就输出网格表,注意!每个输出之间都要有一行空行
思路:最开始,感觉还是蛮简单的嘛,就是先把字母表确定下来,然后后面移动的字符一个一个判断,还能省一下一个装移动字符的数组,然后进行移动,用一下swap,敲来敲去,最后试一下案列,欸!输出都快不成样子了哭了,第一个案例输出时还是很正常的,然后就开始漏字符,而且有些还换行,考虑到用的是cin,网上查来查去,才发现是cin的问题,之前C语言的时候,scanf就不能读取空格和换行符,只能用getchar和gets,gets用于读取字符串,而且getchar用来读取单个字符,还有一种较麻烦的scanf,就是
#include<stdio.h>
int main()
{
char arr[10];
scanf("%[^\n]", arr);
printf("%s", arr);
return 0;
}
cin跟scanf差不多,都是不读空格,把最原始的东西忘了变成小白菜了,就算用getchar,还需要注意换行符,一不小心就读进去表格了,所以对于换行符该读取的位置需要考虑好
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a,b,flag,cnt;
cnt = 1;
char ch;
while(1){
ch = getchar();
if(ch == 'Z')return 0;
char mp[5][5];
flag = 1;
if(ch == ' ')a = 0,b = 0;
mp[0][0] = ch;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(i||j){
ch = getchar();
if(ch == ' ')a = i,b = j;
mp[i][j] = ch;
}
}
getchar();//吸收"\n"
}
string op;
while(ch = getchar()){
if(ch == '0')break;
else op.push_back(ch);
}
getchar();//\n
//暂时还没试(不是)出来不用另一个数组的ac方法
// while((ch = getchar())&&ch != '0'){
for(int i=0;i<op.size();i++){
ch = op[i];
int l = a,r = b;
if(ch == 'A')a --;
else if(ch == 'B')a ++;
else if(ch == 'L')b --;
else if(ch == 'R')b ++;
if(a < 0||b < 0||a > 4||b > 4){
flag = 0;
break;
}else swap(mp[l][r],mp[a][b]);
}
if(cnt != 1)cout << endl;//如果放在后面,无法判断是不是最后一个案例,所以放在前面判断
cout << "Puzzle #" << cnt << ":" << endl;
cnt++;
if(flag){
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(j)cout << " ";
cout << mp[i][j];
}
cout << endl;
}
}else{
cout << "This puzzle has no final configuration." << endl;
}
}
return 0;
}