Una cuestión de procedimiento
Los datos de entrada deben escribirse en un archivo de datos según el formato, por ejemplo, llamado case4.txt
INICIO y FIN deben estar en mayúscula y no tener espacios, porque son líneas de control.
Guarde el siguiente programa en Judge.c y compílelo (lo probé con el compilador MS VC)
Ejecute el comando:
judge.exe case4. txt
=======================================
#include lt;stdio.hgt;
#include lt;stdlib.hgt;
#include lt;string.hgt;
ARCHIVO * fin;
main(int argc, char *argv[])
{
char nombre en[40];
int T ;
int i, j, k;
char str[8];
int N1, N2
car tmp sin firmar; ;
carácter sin firmar a[5000], b[5000];
char *buff;
if (argc lt; 2) {
printf("\007Uso: s nombre_archivo.txt\n", argv[0]);
printf("Por ejemplo: s case4.txt\n", argv[0]);
salir(1);
};
strcpy(nombre en, argv[1]); fopen(namein, "r")) ==NULL ) {
fprintf(stderr, "No se puede abrir el archivo de entrada s \n", namein);
exit(1 );
};
buff = (char *) malloc(5000 * sizeof (char));
if ( !buff ) {
printf("\007No hay suficiente espacio para asignar\n"); exit(1);
}
if ( fgets(buff, 5000, fin) != NULL){
sscanf(buff, "d", amp; T); // lee el número de casos
}; 0; klt; T; k )
{
// leer al primer INICIO
mientras (fgets(buff, 5000, fin) !=NULL) {
sscanf(buff, "s", y str[0]);
if (strncmp(y str[0], "START", 5) == 0) romper;
};
// leer archivo-1
N1 = 0; 5000, fin) !=NULL){
sscanf(buff, "s", y str[0]);
if (strncmp(y str[0], "FIN", 3) == 0) romper
for (j=0; jlt; 500
0; j ){
sscanf(buff j, "c", amp; tmp);
a[N1] = tmp; [N1] == '\n') {N1 = N1 1; romper };
N1 = N1
}
strcpy(amperio) ; buff[0], "\0");
};
// leer en el segundo INICIO
mientras (fgets(buff, 5000, fin) ) !=NULL){
sscanf(buff, "s", y str[0]);
if (strncmp(y str[0], "START"); , 5) == 0) romper
};
// leer archivo-2
N2 = 0
mientras; (fgets(buff, 5000, fin) !=NULL){
sscanf(buff, "s", y str[0]);
if (strncmp(amp; str[0], "END", 3) == 0) break;
for (j=0; jlt; 5000; j ){
sscanf(buff j, " c", amp; tmp);
b[N2] = tmp;
if (b[N2] == '\n') {N2 = N2 1; romper; };
N2 = N2 1;
}
strcpy(amp; buff[0], "\0"); >};
// comp 2 archivos:
if (N1 == N2) {
for (i=0; i lt; N1; i ) {
si (a[i] != b[i]) ir a Lab_comp_2;
};
} más {ir a Lab_comp_2 }; /p>
printf("¡Caso d aceptado!\n",k 1);
ir a Lab_next_case;
Lab_comp_2:;
// filtrar y comp
j=0;
for (i=0; ilt; N1; i){
a[j]=a[i] ;
si (a[i] != ' ' amp; amp; a[i] != '\t' amp; amp; a[i] != '\n') j = j 1;
};
N1 = j 1;
j=0; ; i ){
b[j]=b[i];
si (b[i] != ' ' amp;amp; b[i] != '\ t' amp;amp; b[i] != '\n') j = j 1;
};
N2 = j 1; si (N1 == N2) {
for (i=0;ilt;N1;i) {
si (a[i] != b[i])
goto Lab_comp_3;
};
};
printf("Error de presentación del caso d", k 1); >ir a Lab_next_case;
Lab_comp_3:;
printf("¡Caso d Respuesta incorrecta!\n", k 1);
Lab_next_case:;
};
salir(0);
}
================== = =========================
Principio del programa:
Utilice fgets() para leer un línea y analizarla Una línea.
La primera línea es el número de casos.
Cada caso tiene dos bloques de datos.
La línea inicial del bloque de datos es START y la línea final es END.
El número de líneas en cada bloque no es fijo, y el número de caracteres en cada línea no es fijo, pero cada bloque no debe exceder las 5.000 palabras.
Entonces, el tamaño de la matriz es 5000 y el tamaño del búfer de fila es 5000.
Compare dos bloques de datos después de leer cada caso.
Si el número de palabras es igual y cada palabra correspondiente es igual, imprime "Aceptar" y procesa el siguiente caso.
Si el número de palabras es igual y las palabras correspondientes son diferentes, o si el número de palabras no es igual, se realiza el filtrado y luego se compara después del procesamiento.
La respuesta al ejemplo es:
Caso 1 ¡Error de presentación!
Caso 2 ¡Error de presentación!
Caso 3 ¡Respuesta incorrecta!
p>¡Caso 4 aceptado!
Archivo de entrada:
escriba case4.txt:
4
INICIO
1 2 = 3
FIN
INICIO
1 2=3
FIN
INICIO
1 2 = 3
FIN
INICIO
1 2 = 3
FIN
INICIO
1 2 = 3
FIN
INICIO
1 2 = 4
FIN
INICIO
1 2 = 3
FIN
INICIO
1 2 = 3
FIN