Uva1592 Database 【map应用】【例题5-9】

题目:Database

题意:n,m大小的字符串,是否存在俩个不同行r1,r2和不同列c1,c2,使得这俩行和这俩列相同!即(r1,c1)和(r2,c1)相同, (r1,c2)和(r2,c2)相同!

思路:只枚举c1和c2,然后从上到下扫描行。每次碰到一个新的行r,把c1,c2作为map的键,r为对应的值存入,当扫描到键值存在时,即为当前行为r2,键值对应的值为r1

这里键需要作一个预处理,将每一个字符串再利用一个map集合给其编号,处理完后整个字符串数组即为整数数组,不同字符串有不同的编号,相同的编号相同。

c1,c2同时为键的话需要用一个pair类型,pair<类型,类型>,它可以将俩个值看作为一个值,make_pair(值,值)是将俩个值放入!

最后要注意的是:使用集合,容器的一定要清空!!!

代码:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 10005;
const int maxm = 15;
int number[maxn][maxm];
mapIDcache;//每个字符串对应的id
map< pair,int>scan;//键:c1,c2共同组成,值:r1
vectorvtr;
int ID(string str)//给字符串分配编号
{
    if(IDcache.count(str))//此字符串是否存在
        return IDcache[str];//存在,返回它的id
    vtr.push_back(str);//不存在,加入容器
    return IDcache[str] = vtr.size() - 1;//它所在容器的位置即为它的id
}
int main()
{
    int n,m;
    char temp[85];
    while(cin >> n >> m)
    {
        getchar();//吸收回车
        for(int i=0;i



你可能感兴趣的:(第5章,STL入门,UVa)