UVa1592 数据库

本文通过一道具体的教学题目详细介绍了C++中的数据读取、pair类型使用及goto语句等知识点,并分享了作者的学习心得。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一道完完全全的教学题,有太多的东西可以从中学习,还有不少的细节处理。看了大神的代码才会做,还败在了不少细节上。。。

学到的东西如下:

1、数据的读入是用逗号分隔开的,在用了一段时间的cin之后,竟忘了怎样去处理这种用逗号分隔开的字符串,用法可以是getline(cin,temp),这样读取一行字符串。果然有了飞机大炮后,就忘记了小米加步枪怎样使用了。

2、 C++中还有把两个数据看做一个的东西,就是pair函数。pair的操作如下:

pair<string, string> a("James", "Joy");
//或者是
pair<int, string> a;
a = make_pair(1, "Joy");
//分别调用a.first,a.second(没有括号)即可得到值

3、 goto的用法,在代码里面可以看到。若是goto没有执行的话,函数运行到那里也会执行。

代码:看了别人的代码之后写的,大神的代码写的真的是太好了,由衷的佩服!

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
using namespace std;

typedef pair<int,int> two_data;
map<string,int> s1;
map<two_data,int> s2;

int data[10010][20];

int main()
{
    int i,j,k,n,m;
    string tmp,x;
    while(cin >> n >> m)
    {
        getchar();
        int cnt = 0;
        for(i = 0;i < n;i++)
        {
            getline(cin,tmp);
            k = 0;
            for(j = 0;j < tmp.length();j++)
            {
                if(tmp[j] != ',')
                {
                    x += tmp[j];
                }
                if(tmp[j] == ',' || j == tmp.length()-1) 
                //不能写成else if,否则当读取至最后一个字符时,无法结束改行的读取
                {
                    if(s1.count(x) == 0)
                    {
                        s1[x] = cnt++;
                    }
                    data[i][k++] = s1[x];
                    x = "";
                }       
            } 
        }

        for(i = 0;i < m-1;i++)
        {
            for(j = i+1;j < m;j++)
            {
                for(k = 0;k < n;k++)
                {
                    if(s2.count(make_pair(data[k][i],data[k][j])) == 1)
                    {
                        cout << "NO" << endl;
                        cout << s2[make_pair(data[k][i],data[k][j])]+1 << " " << k+1 << endl;
                        cout << i+1 << " " << j+1 << endl;
                        goto END;
                    }
                    else
                    {
                        s2[make_pair(data[k][i],data[k][j])] = k;
                    }
                }
                s2.clear(); //一定要清空,否则若是存在不同列形成的value相同时,答案会出错
            }
        }
        cout << "YES" << endl;
    //YES之后也会继续执行   
    END: 
        memset(data,0,sizeof(data));
        s1.clear();
        s2.clear();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值