题目大意:给出一个n行m列的数据库数据,找出是否存在不同行r1,r2和两个不同列c1,c2使得这两行两列相同

解题思路:STL的应用,用pair将一行的两列合并成一个数,然后在用map映射,看是否存在

#include<cstdio>
#include<cstring>
#include<map>
#include<string>
using namespace std;
#define maxn 10010

char str[maxn];
int arr[maxn][15];
typedef pair<int,int> Pair;
map<string,int> ID;
map<Pair,int> M;

int main() {
    int n, m;
    while(scanf("%d%d", &n, &m) == 2) {
        getchar();
        memset(arr,0,sizeof(arr));
        ID.clear();
        M.clear();
        int cnt = 0;
        for(int row = 0; row < n; row++) {
            gets(str);
            int len = strlen(str), col = 0;
            string tmp;
            for(int i = 0; i < len; i++) {
                if(str[i] != ',')
                    tmp += str[i];
                if(str[i] == ',' || i == len - 1) {
                    if(!ID.count(tmp)) 
                        ID[tmp] = cnt++;
                    arr[row][col++] = ID[tmp];
                    tmp.clear();
                }
            }
        }
        bool flag = false;

        for(int i = 0; i < m; i++) {
            if(flag)
                break;
            for(int j = i + 1; j < m; j++) {
                if(flag)
                    break;
                for(int k = 0; k < n; k++) {
                    int x = arr[k][i], y = arr[k][j];
                    if(M.count(Pair(x,y))) {
                        printf("NO\n");
                        printf("%d %d\n", M[Pair(x,y)] + 1, k + 1);
                        printf("%d %d\n", i + 1, j + 1);
                        flag = true;
                        break;
                    }
                    M[Pair(x,y)] = k;
                }
               M.clear();   
            } 
        }
       if(!flag)
            printf("YES\n");   
    }
    return 0;
}