【java_蓝桥杯算法训练】算法训练 新生舞会

举报
昵称: 发表于 2022/02/23 20:42:40 2022/02/23
【摘要】 算法训练 新生舞会资源限制时间限制:1.0s   内存限制:512.0MB问题描述  新生舞会开始了。n名新生每人有三个属性:姓名、学号、性别。其中,姓名用长度不超过20的仅由大小写字母构成的字符串表示,学号用长度不超过10的仅由数字构成的字符串表示,性别用一个大写字符‘F’或‘M’表示。任意两人的姓名、学号均互不相同。换言之,每个人可被其姓名或学号唯一确定。给出m对两人的信息(姓名或学号)...

算法训练 新生舞会

资源限制

时间限制: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
提示

  可以把名字和学号都当成字符串处理。可以按以下流程实现。


#include<iostream>
  #include<cstring>
  using namespace std;

  struct tstudent
  {
  char name[21];
  char num[21];
  char sex;
  };

  void readdata(tstudent student[], int n)
  {
//输入N个学生的信息
  }

  int findstudent(tstudent student[], int n, char* data)
  {
  if (data == NULL) return -1;

//判断是否有某个学生的学号或名字等于data,如果有,函数返回该学生在student数组中的序号,否则返回-1
  }

  void solve(tstudent student[], int n, int m)
  {
  char x[21], y[21];
  for (int i=0; i<m; i++) {
//输入两个人的信息X、Y。通过调用findstudent函数判断这两个人能否成为舞伴
  }
  }

  int main()
  {
  int n, m;
  tstudent student[1010];

  cin>>n;

  readdata(student, n);
  cin>>m;
  solve(student, n, m);
  }

以上为题目

分析:

以上题目给出的提示代码为c语言的,我们可以不用这么麻烦,定义一个二维数组arr[n][3]来存储n个人的姓名、学号、性别,然后调用子函数来根据学号、姓名来判断是否能构成舞伴,一男一女构成条件。在子函数阶段我们怎样来判别一个数是否为数字只需要对字符转中的一个值chatAt判断它是不是>='0’并且<=‘9’即可完成判断,然后返回”M”或者"F"。

java代码如下:

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		//用来存放n名新生的值
      int n=sc.nextInt();
      //数组arr用来存放n名新生的姓名、学号、性别
      String arr [][]=new String[n][3];
      for (int i = 0; i < n; i++) {
		for (int j = 0; j < 3; j++) {
			arr[i][j]=sc.next();
		}
	}
      //k用来存放要查找的次数
      int k=sc.nextInt();
      //遍历调用函数查找
      for (int i = 0; i < k; i++) {
    	  //s1、s2用来存放的值姓名或者学号
		String s1=sc.next();
		String s2=sc.next();
		//sex1、sex2调用自定义c函数来返回性别
		String sex1=c(s1,n,arr);
		String sex2=c(s2,n,arr);
		//判断并输出
		if((sex1.equals("M")&&sex2.equals("F"))||(sex1.equals("F")&&sex2.equals("M")))
			System.out.println("Y");
		else {
			System.out.println("N");
		}
	}
    
	}
	//传入 s1姓名或者学号信息,n输入学生数,arr传入即将要便利的数组
	  static String c(String s1,int n,String arr[][]) {
//		  对字符串进行判断是否为数字然后指定查询
  		if(s1.charAt(0)>='0'&&s1.charAt(0)<='9') {
  			for (int j = 0; j < n; j++) {
  				if(arr[j][1].equals(s1)) {
  					return arr[j][2];
  					
  				}
  			}
  		}else {
  			//对字符串进行循环遍历,并返回性别值
  			for (int j = 0; j < n; j++) {
  				if(arr[j][0].equals(s1)) {
  					 return arr[j][2];
  					
  				}
  			}
  		}
  		return "-1";
    }

}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。