紫书 第三章 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
 */
posted @ 2025-05-31 09:34  Guaninf  阅读(6)  评论(0)    收藏  举报