紫书章五例题9 数据库 UVA 1592 (map+vector)

来源:互联网 发布:淘宝碰到专业差评师 编辑:程序博客网 时间:2024/04/26 21:56

题意:判断是否有两行有相同的两列。
然后刚拿到这道题的时候想放到哪里呢?
然后这里是放到map里面,然后每一个相同的部分会对应一个常数,但是在不同列可能也有相同的部分呀?所以我们定义了一个map M[maxn],对每一列进行对应。然后我们vector 存的是对应的部分所对应的数字。我们最后进行扫描的对列进行枚举,然后从上往下判断。因为v里面存的就是行号嘛。
但是其中会总是WA,因为还有这样的一种情况
3 3
1 2 5
1 4 3
1 5 3
这个时候a=v[2][0]=0,b=v[2][2]=1,他们的行号不相同,那怎么办?我们判断一下,v[b][0]是否为a就好啦

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <vector>#include <map>using namespace std;#define maxn 10005vector<int > v[maxn];map <string, int > M[10];string str;int h=0,n,m;;int id(string g,int k){    if(M[k].count(g)!=0) {return M[k][g];}    M[k][g]=h;   // cout<<M[k][g]<<endl;    return M[k][g];}void read(){    char c;    str.clear();    int k=0;    for(;;)    {        c=getchar();        if(k==m) break;        if(c=='\n'||c=='\r')        {            if(!str.empty()) v[h].push_back(id(str,k));            str.clear();            break;        }        else        {            if(c==','){                v[h].push_back(id(str,k));                k++;                str.clear();            }            else str+=c;        }    }}void solve(){    int flag=0;    for(int i=0;i<m;i++)    {        for(int j=i+1;j<m;j++)        {            for(int k=0;k<n;k++){                int a=v[k][i];                int b=v[k][j];                if(a<b) {//判断                      if(v[b][i]==a)                          a=b;                }                else if(a>b)                {                    if(b==v[a][j])                        b=a;}                if(a!=k&&b!=k&&a==b)                {                    flag=1;                    printf("NO\n");                    printf("%d %d\n",a+1,k+1);                    printf("%d %d\n",i+1,j+1);                    break;                }            }            if(flag) break;        }        if(flag) break;    }    if(!flag) printf("YES\n");}int main(){   // freopen("E:\\input.txt","r",stdin);    while(scanf("%d %d",&n,&m)!=EOF)    {        getchar();        for(int i=0;i<10;i++)        M[i].clear();        for(int i=0;i<maxn;i++)            v[i].clear();        for(h=0;h<n;h++)        read();        solve();    }    return 0;}

然后看到紫书上说的是将两列的信息作为一个二元组放到map里。

0 0
原创粉丝点击