题目大意:给出一个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;
}