题目链接
点击打开链接
思路简介
把违禁品存储在数组中,然后每行逐个处理。先把以空格隔开的每行输入中各部分解析出来,再逐个判断该学生所携带的物品是否是违禁品。
注意事项
要注意学生携带物品数为0的情况,否则第二组测试用例过不了
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int stu_fobiden_num, //携带被禁止物品的学生总数
thing_fobiden_num;//携带的所有违禁物件数
/*********************************************************************************
* 函数功能:判断学生携带的该物件是否被禁止
* 变量: a ---学生携带的物件编号
* b ---被禁止的物件
* num---该学生携带的物件总数
***********************************************************************************/
int isFobiden(char a[],char b[][5],int num){
int i;
for (i = 0; i < num;i++){
if (!strcmp(a, b[i]))
return 1;
}
return 0;
}
/*********************************************************************************
* 函数功能:解析出每个学生对应的一行中的空格隔开的各部分
* 变量: count ----- 对input数组解析到的数组下标值
***********************************************************************************/
int get_str(char _input[],char str[],int count){
int i,j;
for (i = count, j = 0; _input[i] != ' ' && _input[i] != '\0';)
str[j++] = _input[i++];
str[j] = '\0';
return count + j +1; //返回input数组中下一个部分的头下标
}
/*********************************************************************************
* 函数功能:把input数组各部分解析出来
* 变量: num ---该学生携带的物件数目
* _name -- 学生的姓名
* _stu_thing --- 该学生携带的各物件
***********************************************************************************/
void del_input(char _input[],int * num,char _stu_thing[][5],char _name[]){
int i,j,k,count;
char temp[10];
count = 0;
count = get_str(_input,_name,count); //得到学生名字
count = get_str(_input, temp, count);//得到物件数目
*num = atoi(temp);
for (k = 0; k < *num;k++){ //逐个解析各物件
count = get_str(_input, temp, count);
strcpy(_stu_thing[k], temp);
}
}
/*********************************************************************************
* 函数功能:处理单个学生对应的一行输入
* 变量: _M ---违禁品总数
* _fobiden -- 违禁品
***********************************************************************************/
void del_one_stu(int _M,char _fobiden[][5]){
char input[100],
name[5], //学生名字
stu_thing[10][5]; //学生携带的物件
int stu_thing_num, //学生携带的物件数目
i, j,
flag; //标志该学生是否有携带违禁物品
gets(input);
del_input(input, &stu_thing_num, stu_thing, name);
for (j = 0, flag = 1; j < stu_thing_num; j++){ //逐个处理学生所带的每件物品
if (isFobiden(stu_thing[j],_fobiden, _M)){
if (flag){
stu_fobiden_num++;
thing_fobiden_num++;
printf("%s: %s", name, stu_thing[j]);
flag = 0;
}
else{
printf(" %s", stu_thing[j]);
thing_fobiden_num++;
}
}
}
if (!flag)
printf("\n");
}
int main(){
char input[100],
name[5], //学生名字
fobiden[6][5], //被禁止的物件
stu_thing[10][5]; //学生携带的物件
int stu_thing_num, //学生携带的物件数目
N, //学生总数
M, //违禁物品总数
i;
scanf("%d %d",&N,&M);
for (i = 0; i < M;i++){
scanf("%s",fobiden[i]);
}
getchar();
for (i = 0; i < N;i++){ //逐个处理每个学生
del_one_stu(M,fobiden);
}
printf("%d %d",stu_fobiden_num,thing_fobiden_num);
return 0;
}