面向对象程序设计(荣誉)实验七 unordered_set

简介: 面向对象程序设计(荣誉)实验七 unordered_set

1. 十二生肖(map)


题目描述


我国十二生肖排序为:鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪


要求全程使用map完成十二生肖以及相互顺序的保存、还有比较、查询等功能


除了存放十二生肖名称使用数组,其他地方使用数组辅助求解,看程度扣分


输入


先输入n表示有n个测试,每个测试输入两行


第一行输入一个生肖,输出生肖对应的


如果生肖是不存在的,作为一种新生肖,并且顺序最后


第二行输入两个不同的生肖x和y(至少一个是已有的),输出x在y之前,或x在y之后


输出


每个测试输出两行


第一行输出生肖与位置,位置从0开始计算


第二行输出前后,看样例输出


样例输入


2

龙 虎

豹 马


样例输出


猫–12

龙在虎之后

马–6

豹在马之后


题解

#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
    string animal[12] = {"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"};
    map<string,int> group;
    for (int i = 0; i < 12;i++)
    {
        group.insert({animal[i], i});
    }
    int t;
    cin>>t;
    while (t--)
    {
        string name;
        cin >> name;
        auto it = group.find(name);
        if(it==group.end())
        {
            group[name] = group.size();
            it = group.find(name);
        }
        cout << it->first << "--" << it->second << endl;
        string x, y;
        cin >> x >> y;
        auto it1 = group.find(x);
        auto it2 = group.find(y);
        if(it1==group.end())
        {
            cout << x << "在" << y << "之后" << endl;
        }
        else if(it2==group.end())
        {
            cout << x << "在" << y << "之前" << endl;
        }
        else
        {
            if(it1->second>it2->second)
            {
                cout << x << "在" << y << "之后" << endl;
            }
            else
            {
                cout << x << "在" << y << "之前" << endl;
            }
        }
    }
    return 0;
}

2. 集合(unordered_set)


题目描述


给定两个集合A,B,集合中的元素为长整型,集合中的元素个数不超过50000个。求两个集合的关系:A是B的真子集;B是A的真子集;A=B;A交B空集;A交B非空。


输入


测试次数


每组测试数据格式如下:


集合A的元素数n 集合B的元素数m


集合A的n个元素


集合B的m个元素


输出


对每组测试数据输出以下情况之一:


A是B的真子集;B是A的真子集; A=B; A交B空集;A交B非空。


样例输入


2

5 3

10 20 30 40 50

10 20 30

4 4

1 2 3 4

2 1 3 4


样例输出


B是A的真子集

A=B


题解

#include<bits/stdc++.h>
using namespace std;
unordered_set<long long> a,b;
bool AinB(){
  for(auto i:a){
    if(b.find(i)==b.end()){
      return false;
    }
  }
  return true;
}
bool BinA(){
  for(auto i:b){
    if(a.find(i)==a.end()){
      return false;
    }
  }
  return true;
}
int AcrossB(){
  int cnt=0;
  for(auto i:a){
    if(b.find(i)!=b.end()){
      cnt++;
    }
  }
  return cnt;
}
int main() {
  int n,m,num,t;
  cin>>t;
  for(int cs=0;cs<t;cs++){
    if(cs!=0) cout<<"\n";
    a.clear();b.clear();
    cin>>n>>m;
    for(int i=0;i<n;i++){
      cin>>num;
      a.insert(num);
    }
    for(int i=0;i<m;i++){
      cin>>num;
      b.insert(num);
    }
    int cross = AcrossB();
    if(cross == 0){
      cout<<"A交B空集";
      continue;
    }else{
      bool f1 = AinB(),f2 = BinA();
      if(f1&&f2){
        cout<<"A=B";
        continue;
      }
      if(f1 && a.size() < b.size()){
        cout<<"A是B的真子集";
        continue;
      }
      if(f2 && a.size() > b.size()){
        cout<<"B是A的真子集";
        continue;
      }
      cout<<"A交B非空";
    }
  }
}


3. 脱单年(set)


题目描述


传说中如果一个年份的四个数字互不相等就是一个大概率脱单的年份。例如1234年就是个脱单年


输入一个初始年份,然后计算多少年后可以遇到脱单年


要求


1、不能直接比较年份四个数字的异同


2、利用set的元素不重复特性来实现检查年份四个数字异同


输入


第一行输入n,表示有n个测试


接着输入n行,每行输入一个初始年份(如果年份不足4位,程序自动高位补0)


输出


计算每个初始年份后的第一个脱单年,并输出相应信息


每个年份输出一行


样例输入


3

2019

2020

2000


样例输出


From 2019, the offsingle year is 2019

From 2020, the offsingle year is 2031

From 2000, the offsingle year is 2013


题解

#include <bits/stdc++.h>
using namespace std;
int main() {
   string word;
   set<string> s;
   while(cin >> word){
      for(int i=0;i<word.size();i++) word[i] = tolower(word[i]);
    regex R("[a-z]{1,}");
      smatch Mat;
      if(regex_search(word, Mat, R))
        s.insert(Mat.str());
  }
  for(auto i:s){
    cout<<i<<endl;
  }
   return 0;
}


4. 图非0面积


题目描述


编程计算由"1"围成的下列图形的面积。面积计算方法是统计"1"所围成的闭合曲线中"0"点的数目。如图所示,在10*10的二维数组中,"1"围住了15个点,因此面积为15。


c0aa9be890364bd9a64cca25e7b582ff.png


输入


测试次数t


每组测试数据格式为:


数组大小m,n


一个由0和1组成的m*n的二维数组


输出


对每个二维数组,输出符号"1"围住的"0"的个数,即围成的面积。假设一定有1组成的闭合曲线,但不唯一。


样例输入


2

10 10

0 0 0 0 0 0 0 0 0 0

0 0 0 0 1 1 1 0 0 0

0 0 0 0 1 0 0 1 0 0

0 0 0 0 0 1 0 0 1 0

0 0 1 0 0 0 1 0 1 0

0 1 0 1 0 1 0 0 1 0

0 1 0 0 1 1 0 1 1 0

0 0 1 0 0 0 0 1 0 0

0 0 0 1 1 1 1 1 0 0

0 0 0 0 0 0 0 0 0 0

5 8

0 1 1 0 0 1 1 0

1 0 1 0 1 0 0 1

0 1 0 1 0 0 1 0

0 1 0 0 1 1 1 0

0 0 0 0 0 0 0 0


样例输出


15

5


题解

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define x first
#define y second
typedef pair<int, int> PII;
const int N = 1010;
bool g[N][N], st[N][N];
int n, m, t;
int cnt;
int dx[4] = {0, -1, 0, 1};
int dy[4] = {1, 0, -1, 0};
void bfs()
{
    memset(st, false, sizeof st);
    queue<PII> q;
    for(int i = 0; i < n; i ++ )
    {
        if(!g[i][0])
        {
            q.push({i, 0});
            st[i][0] = true;
        }
        if(!g[i][m - 1])
        {
            q.push({i, m - 1});
            st[i][0] = true;
        }
    }
    for(int i = 0; i < m; i ++ )
    {
        if(!g[0][i])
        {
            q.push({0, i});
            st[0][i] = true;
        }
        if(!g[n - 1][i])
        {
            q.push({n - 1, i});
            st[n - 1][i] = true;
        }
    }
    while(!q.empty())
    {
        auto t = q.front();
        q.pop();
        g[t.x][t.y] = 1;
        for(int i = 0; i < 4; i ++ )
        {
            int a = t.x + dx[i], b = t.y + dy[i];
            if(a < 0 || a >= n || b < 0 || b >= m) continue;
            if(!st[a][b] && !g[a][b]) q.push({a, b});
        }
    }
}
void count()
{
    cnt = 0;
    for(int i = 0; i < n; i ++ )
        for(int j = 0; j < m; j ++ )
            if(!g[i][j]) cnt ++ ;
}
int main()
{
    cin >> t;
    while(t -- )
    {
        cin >> n >> m;
        for(int i = 0; i < n; i ++ )
            for(int j = 0; j < m; j ++ )
                cin >> g[i][j];
        bfs();
        count();
        cout << cnt << endl;
    }
    return 0;
}

5. 方程解析(string)


题目描述


以ax^2+bx+c的形式输入方程ax^2+bx+c=0。请用string或regex_match解析出方程的a、b、c。


例如:-10x^2+8x , 则a=-10, b = 8 , c = 0。


10x , 则a = 0, b=10, c = 0。


输入


测试数据有多组


每组测试数据一行,为ax^2+bx+c, 其中a,b,c均为整数,若为0,则该项可不出现。x前系数为+1,-1,1可不出现。


假设方程数据无非法情况。


输出


对每组测试数据,输出每个方程的系数a,b,c。格式见样例


样例输入


0

-x^2

10x^2-9x+7

10x

-10x^2+8x

-123


样例输出


0 0 0

-1 0 0

10 -9 7

0 10 0

-10 8 0

0 0 -123


题解

#include<iostream>
#include<algorithm>
#include<iomanip>
#include<map>
#include<queue>
#include<set>
#include<regex>
using namespace std;
int main()
{
  string s0;
  while(cin>>s0)
  { 
    int a=0,b=0,c=0;
    auto it=s0.begin()+1;
    for(;;it++)
    {
      regex p1("[-+]*[0-9]*x\\^2");
      string s1(s0.begin(),it);
      if(regex_match(s1,p1))
      {
        string s(s0.begin(),it-3);
        if(s.empty())
        {
          a=1;
          s0.erase(s0.begin(),it);
          break;
        }
        else if(s=="-")
        {
          a=-1;
          s0.erase(s0.begin(),it);
          break;
        }
        a=atoi(s.c_str());
        s0.erase(s0.begin(),it);
        break;
      }
      if(it==s0.end())
        break;
    }
    if(s0.empty())
    {
      cout<<a<<" "<<b<<" "<<c<<endl;
      continue;
    }
      it=s0.begin()+1;
    for(;;it++)
    {
      regex p2("[-+]*[0-9]*x");
      string s1(s0.begin(),it);
      if(regex_match(s1,p2))
      {
        string s(s0.begin(),it-1);
        if(s.empty()||s=="+")
        {
          b=1;
          s0.erase(s0.begin(),it);
          break;
        }
        else if(s=="-")
        {
          b=-1;
          s0.erase(s0.begin(),it);
          break;
        }
        b=atoi(s.c_str());
        s0.erase(s0.begin(),it);
        break;
      }
      if(it==s0.end())
        break;
    }
    if(s0.empty())
    {
      cout<<a<<" "<<b<<" "<<c<<endl;
      continue;
    }
    c=atoi(s0.c_str());
    cout<<a<<" "<<b<<" "<<c<<endl;  
  }
  cout<<endl<<endl<<endl<<endl;
  return 0;
}
相关文章
|
算法 C++
面向对象程序设计(荣誉)实验六 set,bitset,multimap
面向对象程序设计(荣誉)实验六 set,bitset,multimap
44 0
|
2天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
16 3
|
1月前
|
存储 自然语言处理 C++
map和set的简单介绍
map和set的简单介绍
20 1
|
1月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
3月前
|
JavaScript 前端开发 定位技术
JavaScript 中如何代理 Set(集合) 和 Map(映射)
JavaScript 中如何代理 Set(集合) 和 Map(映射)
50 0
|
3月前
|
存储 安全 Java
Map和Set(JAVA)
Map和Set(JAVA)
50 1
|
3月前
|
编译器 C++ 容器
【C++学习手札】基于红黑树封装模拟实现map和set
【C++学习手札】基于红黑树封装模拟实现map和set
|
3天前
|
存储 搜索推荐 C++
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
|
23天前
|
存储 JavaScript 前端开发
set和map的区别
set和map的区别
31 4
|
1月前
|
存储 编译器 容器
用红黑树封装实现map和set
用红黑树封装实现map和set
14 0