[PAT Clase A Invierno 2020] 7-3 Ruta de archivo (25 puntos) [¡Muy detallado!]

FP.JPG

La figura muestra la vista de árbol de directorios en el Explorador de archivos de Windows. Cuando se selecciona un archivo, se muestra una ruta de archivo en la barra de navegación anterior. Ahora, dada una vista de árbol de directorios, su trabajo es imprimir la ruta del archivo para cualquier archivo seleccionado.

Especificación de entrada:

Cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea da un número entero positivo N (≤10 3), que es el número total de directorios y archivos. Luego siguen Nlines, cada una proporciona la identificación única de 4 dígitos de un archivo o directorio, comenzando por la identificación raíz única  0000. El formato es que los archivos de profundidad d tendrán sus ID sangrados por d espacios. Se garantiza que no hay conflicto en esta estructura de árbol.

Luego se da un entero positivo K (≤100), seguido de K consultas de ID.

Especificación de salida:

Para cada consultados  ID, imprimir en una línea de la ruta correspondiente desde la raíz hasta el archivo en el formato:  0000->ID1->ID2->...->ID. Si  ID no está en el árbol, imprímalo en su  Error: ID is not found. lugar.

Entrada de muestra:

14
0000
 1234
  2234
   3234
    4234
    4235
    2333
   5234
   6234
    7234
     9999
  0001
   8234
 0002
4 9999 8234 0002 6666

Salida de muestra:

0000->1234->2234->6234->7234->9999
0000->1234->0001->8234
0000->0002
Error: 6666 is not found.

Um, mi código corregido para esta pregunta no pasó la inspección de OJ, así que no estoy seguro si pasa todos los puntos de prueba.

El caso de prueba dado por el título debe pasar:

Ideas:

De hecho, esta pregunta también es muy simple, solo responda la pregunta de acuerdo con el significado de la pregunta.

  1. Defina la estructura de una carpeta y luego defina la estructura de la matriz. Ingrese el nombre de cada carpeta de forma circular. Después de ingresar, juzgue su profundidad de acuerdo con el número de espacios en el nombre y almacene su id y profundidad en la matriz.
  2. Para que se verifique el nombre de cada carpeta, primero defina un vector <string> ans; para instalar la ruta, y luego recorra (de atrás hacia adelante) toda la matriz de estructura del directorio almacenado para ver si este directorio existe. De lo contrario, imprima Error: no se encuentra XXXX.
  3. Si puede encontrarlo, agréguelo a ans, y luego recorra cada directorio antes de este directorio de atrás hacia adelante. El primero que se encuentra y su diferencia de profundidad de 1 es su directorio superior ~ y luego busque el directorio superior del volumen superior Directory , hasta encontrar la carpeta 0000 con el nivel 0

No es difícil, es fácil de entender.

Código:

#include<iostream>
#include<vector>
using namespace std;
struct dir{
	string id; //文件夹名
	int dep;   //文件夹深度
};
int main(){
    int n,k=0;
    cin>>n;
    string s;
    vector<dir> alldir(n);
    getchar();  //* 一定得加上!!!因为后边还有读入一整行的操作!!!
    for(int i=0;i<n;i++){
        getline(cin,s);
		int d=0;//文件夹深度 
        for(int j=0;j<s.size();j++)
        	if(s[j]==' ') d++;  //注意不是:" ",会出error~ 
        	else break;
        alldir.push_back({s.substr(d),d});
    }
	cin>>k;
	for(int i=0;i<k;i++){
		int d,j,flag=0;//当前Id的layer记录层数 
		cin>>s;
		vector<string> ans;//装路径的 
		for(j=alldir.size()-1;j>=0;j--){
			if(alldir[j].id==s){
				d=alldir[j].dep;
				ans.push_back(s); 
				flag=1;
				break;
			}
		}
		if(flag==0) {	//不存在 
			printf("Error: %s is not found.\n",s.c_str());	 
		}else{	//存在 
			int a=j-1;
			while(a>=0){  //从当前目录向前找 别忘了 a--
				if(alldir[a].dep==d-1){
					d--;
					ans.push_back(alldir[a].id); 	
				}
				a--; 
			}
			for(int m=ans.size()-1;m>=0;m--){
				if(m!=ans.size()-1) cout<<"->";
				printf("%s",ans[m].c_str());
			}
			cout<<endl;
		} 	
	}
	return 0;
}

para resumir:

No es difícil pensar en la idea de esta pregunta. De hecho, me tomó alrededor de media hora escribir el código central, ¡pero! ! ! Después de depurar durante una hora y media, aparecieron varias situaciones en el medio. ¡qué! (Llama la marmota ~

  • El fenómeno de mezclar las variables cíclicas i y j ocurre con frecuencia, por lo que debes prestarle atención en el futuro.
  • Si hay una operación que lee una línea completa después de cin o scanf (), como getline (cin, s), debe agregar un getchar () después de cin y scanf (). Esto se ha encontrado muchas veces antes, pero como resultado, el último nombre de carpeta 0002 no siempre se puede agregar a la matriz de estructura.
  • Cada elemento de la cadena es de tipo char. Convertir un elemento en un entero es s [i] - '0' en lugar de la función stoi (string s) de #include <cctype> !!! 
  • Cuando se compara un elemento de una cadena con un carácter, es s [i] == ' c '  , que es comillas simples en lugar de comillas dobles.
  • Es más conciso juzgar con una bandera = 0/1
  • printf ("% s", xxx.c_str ()); // Use printf para imprimir variables de cadena tenga cuidado, agregue .c_str () después del nombre de la variable 
  • . . . . . . Preste atención a los detalles, de lo contrario, la idea es correcta y el envío no se enviará debido a la depuración del tiempo de espera

Supongo que te gusta

Origin blog.csdn.net/WKX_5/article/details/114675582
Recomendado
Clasificación