試題 算法訓練 新生舞會

試題 算法訓練 新生舞會

題目描述
資源限制
時間限制:1.0s 內存限制:512.0MB
問題描述
  新生舞會開始了。n名新生每人有三個屬性:姓名、學號、性別。其中,姓名用長度不超過20的僅由大小寫字母構成的字符串表示,學號用長度不超過10的僅由數字構成的字符串表示,性別用一個大寫字符‘F’或‘M’表示。任意兩人的姓名、學號均互不相同。換言之,每個人可被其姓名或學號唯一確定。給出m對兩人的信息(姓名或學號),判斷他們是否能共舞。兩人能共舞的充要條件爲兩人性別相異。

輸入
  第一行一個整數n(2<=n<=1000),表示學生人數。接下來的n行每行依次包含一名新生的姓名、學號、性別,分別用一個空格隔開。
  之後的一行是一個整數m(1<=m<=1000),表示詢問的數目。接着的m行每行包含兩個信息(姓名或學號),保證兩個信息不屬於同一人,中間用一個空格隔開。

輸出
  對於每個詢問輸出一行,如果兩人可以共舞,輸出一個大寫字母‘Y’,否則輸出一個大寫字母‘N’。

樣例輸入
4
John 10 M
Jack 11 M
Kate 20 F
Jim 21 M
3
John 11
20 Jack
Jim Jack

樣例輸出
  N
  Y
  N
思路:

定義一個結構體,輸入每個人的信息,然後每輸入兩個字符串,首先判斷字符串是姓名還是學號(通過字符串的首字母來判斷),然後找到該姓名或者學號這個人對應的性別。兩個字符串的最終性別結果相反,則可以共舞,否則,不然。

AC代碼:

#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
struct node//每個學生的信息 
{
	char name[20];
	char id[10];
	char sex;
}stu[1000];
int main()
{
	int n,i;
	cin>>n;
	for(i=0;i<n;i++)
		cin>>stu[i].name>>stu[i].id>>stu[i].sex;
	int m;
	cin>>m;
	char str1[20],str2[20];//姓名或者學號 
	while(m--)
	{
		cin>>str1>>str2;
		char ans1,ans2;//輸入的姓名或者學號所對應的性別 
		if(str1[0]>='0'&&str1[0]<='9')//是學號 
			for(i=0;i<n;i++)
			{
				if(strcmp(str1,stu[i].id)==0)
				{
					ans1=stu[i].sex;//找到該學號對應的人的性別 
					break;
				}
			}
		else //是姓名 
			for(i=0;i<n;i++)
			{
				if(strcmp(str1,stu[i].name)==0)
				{
					ans1=stu[i].sex;//找到該姓名對應的人的性別 
					break;
				}
			}
	if(str2[0]>='0'&&str2[0]<='9')//是學號 
		for(i=0;i<n;i++)
		{
			if(strcmp(str2,stu[i].id)==0)
			{
				ans2=stu[i].sex;//找到該學號對應的人的性別 
				break;
			}
		}
	else //是姓名 
		for(i=0;i<n;i++)
		{
			if(strcmp(str2,stu[i].name)==0)
			{
				ans2=stu[i].sex;//找到該姓名對應的人的性別 
				break;
			}
		}
		if(ans1==ans2)//性別相同,不能共舞 
			cout<<"N"<<endl;
		else
			cout<<"Y"<<endl;
	}
    return 0;
}
發佈了159 篇原創文章 · 獲贊 87 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章