PAT B 1052 para vender Meng atención /// /// utilizando la cola de escape de salida de caracteres para extraer el contenido de los soportes

Mengmeng piridazin emoticon por lo general se compone de "mano", "ojos", "boca" de tres partes principales. Por simplicidad, se asume una expresión simbólica se emite en el siguiente formato:
([puerto] [izquierda] [derecha]) [izquierda] [derecha]
favor de salida requisitos ahora se dan conjunto opcional de símbolos, de los usuarios expresión.

: Formato de entrada
para la entrada correspondiente a las tres primeras líneas de los disparos anteriores, seleccionables conjunto de símbolos ojos, la boca. Cada símbolo entre corchetes [] dentro. Título asegurar que cada sistema tiene al menos un símbolo, el símbolo no es más de 10; cada símbolo contiene de uno a cuatro caracteres no nulo.
Después de la línea se le da un número entero positivo K, el número de solicitudes de los usuarios. Entonces K filas cada usuario se le da una selección de símbolos, el orden de la mano izquierda, el ojo izquierdo, la boca, ojo, mano - sólo para dar el número de símbolo en el conjunto respectivo (a partir de 1), un espacio entre los números separada.
Formato de salida:
una solicitud para cada usuario generado en la expresión de la línea de salida. Si el número de serie no existe el usuario selecciona, entonces la salida ¿Me estás tomando el pelo? @ / @ .

de entrada de la muestra:
[╮] [╭] [O] [ ] [/ ] [<] [>]
[╯] [╰] [^] [-] [=] [>] [<] [@] [⊙ ]
[Д] [▽ para] [_] [[épsilon]] [^] ...
4.
1. 1 2 2 2.
6. 8. 1. 5. 5.
3. 3. 4. 3. 3.
2. 9. 3 10. 3
muestra de salida:
╮ (╯ ▽ para ╰) ╭
< (Д = @) / ~
O ( [épsilon] ) O
estáis de broma? @ / @

Idea: De hecho, esta idea es muy simple problema, aplicar un poco de dificultad. Paso es extraer la cadena en los corchetes en primer lugar, en unidades de cada prensadas en una matriz de cadenas. carácter Entonces como se requiere en el que la composición, con la salida final.
Pero hay un pozo de nota: '\' es el carácter de escape, para mostrar que '\', es necesario agregar delante de un '\'.
Por lo que la cadena entre paréntesis cómo extraerlo? Me refiero a la idea de utilizar la pila para lograr los soportes a juego, el uso de la cola para lograr:

vector<string> change(string s)
{
	int flag = 0;
	vector<string> vec;
	queue<char> que;
	for (int i = 0; i < s.size(); i++)
	{
		string ans = "";
		if (s[i] == '[') //如果是[则入队,并标记flag为1
		{
			flag = 1;
			que.push(s[i]);
		}else if (flag == 1 && s[i] != ']' && s[i] != ' ') //在队列中有左括号的情况下才能入队
		{
			if (s[i] == '\\') //如果是转义字符,则入队两个
				que.push('\\');
			else
				que.push(s[i]);
		}
		if (s[i] == ']') //如果是右括号,先将队首的左括号出队
		{
			que.pop();
			while (!que.empty())
			{
				ans += que.front();
				que.pop();
			}
			vec.push_back(ans);
			flag = 0; //因为左括号出掉了,所以flag变为0
		}
	}
	return vec;
}

código Total:

#include <iostream>
#include <string>
#include <queue>
#include <vector>
using namespace std;
vector<string> change(string s);
int main()
{
	string hand, eye, mouth;
	getline(cin, hand);
	vector<string> hd = change(hand);
	getline(cin, eye);
	vector<string> is = change(eye);
	getline(cin, mouth);	
	vector<string> mt = change(mouth);
	int num;
	cin >> num;
	int flag = 0;
	string ans = "";
	for (int i = 0; i < num; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			int idnum;
			cin >> idnum;
			switch(j)
			{
			case 0:
				if (idnum > hd.size() || idnum < 1) //注意条件
				{
					flag = 1;
					break;
				}
				ans += hd[idnum - 1];
				break;
			case 1:
				if (idnum > is.size() || idnum < 1)
				{
					flag = 1;
					break;
				}
				ans += '(' + is[idnum - 1];
				break;
			case 2:
				if (idnum > mt.size() || idnum < 1)
				{
					flag = 1;
					break;
				}
				ans += mt[idnum - 1];
				break;
			case 3:
				if (idnum > is.size() || idnum < 1)
				{
					flag = 1;
					break;
				}
				ans += is[idnum - 1] + ')';
				break;
			case 4:
				if (idnum > hd.size() || idnum < 1)
				{
					flag = 1;
					break;
				}
				ans += hd[idnum - 1];
				break;
			}
		}
		if (flag == 0)
			cout << ans << endl;
		else
			cout << "Are you kidding me? @\\/@" << endl;
		flag = 0;
		ans.clear();
	}
	return 0;
}
vector<string> change(string s)
{
	int flag = 0;
	vector<string> vec;
	queue<char> que;
	for (int i = 0; i < s.size(); i++)
	{
		string ans = "";
		if (s[i] == '[')
		{
			flag = 1;
			que.push(s[i]);
		}else if (flag == 1 && s[i] != ']' && s[i] != ' ')
		{
			if (s[i] == '\\')
				que.push('\\');
			else
				que.push(s[i]);
		}
		if (s[i] == ']')
		{
			que.pop();
			while (!que.empty())
			{
				ans += que.front();
				que.pop();
			}
			vec.push_back(ans);
			flag = 0;
		}
	}
	return vec;
}

Liu Dios y la práctica, mucho más que mi concisa:

#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
using namespace std;
int main()
{
	vector<vector<string> > vec;
	for (int i = 0; i < 3; i++)
	{
		string s;
		getline(cin, s);
		vector<string> row;
		int j = 0, k = 0;
		while (j < s.length())
		{
			if (s[j] == '[')
			{
				while (k++ < s.length())
				{
					if (s[k] == ']')
					{
						row.push_back(s.substr(j + 1, k - j - 1));
						break;
					}
				}
			}
			j++;
		}
		vec.push_back(row);
	}
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int a, b, c, d, e;
		cin >> a >> b >> c >> d >> e;
		if (a > vec[0].size() || b > vec[1].size() || c > vec[2].size() || d > vec[1].size() || e > vec[0].size() || a < 1 || b < 1 || c < 1 || d < 1 || e < 1)
		{
			cout << "Are you kidding me? @\\/@" << endl;
			continue;
		}
		cout << vec[0][a - 1] << "(" << vec[1][b - 1] << vec[2][c - 1] << vec[1][d - 1] << ")" << vec[0][e - 1] << endl;
	}
	system("pause");
	return 0;
}
Publicados 101 artículos originales · ganado elogios 1 · vistas 1954

Supongo que te gusta

Origin blog.csdn.net/weixin_43318827/article/details/105335048
Recomendado
Clasificación