【刘汝佳书】例题5-9 UVA1592(关于编号和map判重)

博客讲述了如何解决UVA1592问题,核心是通过按列枚举并利用编号和map判断二元组是否重复。通过将字符串转化为int,再组合成一个整数作为key存入map,以此检查是否存在重复的二元组。如果发现重复则输出NO,否则遍历完所有列后输出YES。

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

【2019.4.5】
这道题看了书上思路才写出来
从uDebug中的测例可以看出,代码是需要按列枚举的:先从第1列和第2列开始,枚举每一行,把这一行的第1列和第2列的元素组成二元组,记录其出现的行数,放到map里,看是否有重复的二元组
如果找到重复二元组,直接跳出所有循环,输出NO
如果没找到,就再枚举第1列和第3列,直到枚举完所有列,输出YES

map的结构:<<二元组>,<行数>>
<二元组>:<i行j列的字符串,i行k列的字符串>
<行数>:<i>

那么现在问题变成了:如何把两个字符串组成二元组放到map的key里?
我们可以分两步来做:

1、首先将一个字符串转化成一个int整数
将【复杂数据类型】转换成【int】的一大方法就是编号(ID),用map<复杂数据类型, int>来提供一一映射。
比如这道题,是把字符串string转换成int
比如【刘汝佳书】例题5-5 UVA12096这道题,是把集合set转换为int
无外乎就是写一个int getID(string s)子函数,当map中有s时,返回其ID,没有时,先插入到map中,并根据map.size()返回其ID

2、其次将两个int整数转化成二元组
突然想起来这道电子表格的题【刘汝佳书】例题4-5 UVA512
这道题里面用了一个方法:用一个整数index = i*10000 + j来表示一个位置的格子(i,j)
其中10000是个比较大的数字,保证index不会重复
在本题中,我们也可以用这样的方法,把两个int整数转化成一个整数
本题最多有10000行,10列,10^6个元素
因此,假设两个字符串的序号分别为ij,我们可以用index = i*100000 + j来表示ij组成的二元组,其中indexlong long型的
此时,map结构变成:

map的结构:<long long, int>
long long:第i行中,j列和k列的字符串组成的二元组
int:行数,i

代码如下:

#include <iostream>
#include <map>
#include <string>
#include <vector>

using namespace std;

vector<vector<string>> table;	//存表
map<long long, int> mi;    		//字符串对-行号
map<string, int> ID;			//字符串-ID

//获取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值