Luogu P1928 Alien 코드 문제 솔루션

주제 링크

질문 줄기:

상대적으로 간단하며 문자열과 유사합니다. ABC[3LM][2[2HJ]]ABCLMLMLMHJHJHJHJ, 원래 문자열을 제공하고 압축 해제된 문자열을 가져옵니다.

아이디어:

이 질문은 비교적 간단한 재귀이며, 달성하기 위해 스택을 사용합니다. 문자를 읽을 때마다 스택에 쌓이고, 마주치면 ]숫자를 읽을 때까지 문자를 점차적으로 스택에서 읽어 임시 문자열을 형성합니다.숫자가 추출된 후 배수에 따라 숫자의 임시 문자열을 확장한 다음 스택에 넣습니다.

코드는 다음과 같습니다.

#include<bits/stdc++.h>
using namespace std;

int main()
{
    string s;
    char word, temp[20005];
    cin>>s;
    stack<char> res;

    int size = s.size(), j, num, order;
    for (int i = 0; i < size; ++i)
    {
        word = s[i];
        if (word != ']')
            res.push(word);
        else  // 如果获取到了 ]
        {
            j = -1;
            // 从stack中把字符拿出来,放到temp中
            word = res.top();;
            res.pop();
            while (word < '0' || word > '9')  // 如果没拿到数字
            {
                temp[++j] = word;
                word = res.top();
                res.pop();
            }
            // 如果拿到了数字  开始提取数字
            num = word - '0';
            order = 10;
            word = res.top();
            res.pop();
            while (word != '[')
            {
                num += (order * (word - '0'));
                order *= 10;
                word = res.top();
                res.pop();
            }
            // 如果遇到了闭合符号 [
            // num是重复次数  temp最后一个字母的index是j
            for (int p = 0; p < num; ++p)
            {
                for (int y = j; y >=0; --y)
                    res.push(temp[y]);
            }
        }
    }

    j = -1;
    while (!res.empty())
    {
        word = res.top();
        res.pop();
        temp[++j] = word;
    }

    for (int i = j; i >= 0; --i)
        printf("%c", temp[i]);

    return 0;
}

그러나 여기서는 이 상황을 다루지 않았습니다: AS[2[VB3[HJ]]], 압축 해제 후가 됩니다 ASVBHJHJHJVBHJHJHJ. 내 코드는 기본적으로 스택에서 숫자를 가져온 다음 가져옵니다 [. 즉, 이 예제에서는 이 상황을 고려하지 않습니다 VB. 그러나 같은 것이 지나갈 수 있습니다. . .

.

재귀 방법:

다른 사람의 솔루션 직접 보기 :

#include<bits/stdc++.h>
using namespace std;
string read()
{
	int n;
	string s="",s1;
	char c;
	while (cin>>c)//一直读入字符,直到Ctrl+z
	{
		if (c=='[')
		{
			cin>>n;//读入D
			s1=read();//读入X
			while (n--) s+=s1;//重复D次X
            //注:上面不能写成while (n--) s+=read();
		}
		else 
		{
			if (c==']') return s;//返回X
		    else s+=c;//如果不是'['和']',那就是X的一个字符,所以加进X
		}
	}
}
int main()//巨短主函数
{
	cout<<read(); 
	return 0;
}

함수가 재귀적으로 호출되는 것을 볼 수 있습니다 read().

작은 문제

재귀 코드에서 문자열의 경우 숫자 325를 325SFFS직접 읽을 수 있고 문자에서 계속 읽을 수 있는 것 같습니다.int n; cin>>n;S

테스트:

#include<bits/stdc++.h>
#include <sstream>

using namespace std;

int main()
{
    string s("aa45sfjsljfls");

    std::stringstream stream;
    
    stream<<s;

    char c;
    stream>>c;
    cout<<c<<endl;
    stream>>c;
    cout<<c<<endl;

    int n;
    stream>>n;
    cout<<n<<endl;

    stream>>c;
    cout<<c<<endl;

    return 0;
}

결과:

a
a
45
s

Supongo que te gusta

Origin blog.csdn.net/qq_43219379/article/details/124807359
Recomendado
Clasificación