思路是一行一行扫,每一行枚举列。map的思路是一个pair对应一个tuple:pair是两个字符串;tuple是记录的行、第一个列、第二个列,一共三个元素。
样例已过,提交便wa,求调。谢谢!
#include <bits/stdc++.h>
#define rep(i, s, n, c) for (register int i = s; i <= n; i+=c)
using namespace std;
map<pair<string, string>, tuple<int, int, int> > marks;
int n, m;
string mp[10005][15];
int main()
{
while (~scanf("%d%d", &n, &m)) {getchar(); marks.clear();
rep (i, 1, n, 1) {
rep (j, 1, m - 1, 1) {
getline(cin, mp[i][j], ',');
}
getline(cin, mp[i][m], '\n');
// rep (j, 1, m, 1) {
// cout << mp[i][j];
// }printf("\n");
}
// rep (i, 1, n, 1) {
// rep (j, 1, m, 1) {
// cout << mp[i][j] << ",";
// }printf("\n");
// }
bool flag = true;
rep (i, 1, n, 1) {
rep (x1, 1, m, 1) {
rep (x2, x1 + 1, m, 1) {
if (x1 == x2) continue;
// cout << endl << mp[i][x1] << ", " << mp[i][x2] << endl;
pair<string, string> p = make_pair(mp[i][x1], mp[i][x2]);
tuple<int, int, int> t = make_tuple(i, x1, x2);
int r, c1, c2;
tie(r, c1, c2) = marks[p];
if (c1 == x1 && c2 == x2) {
printf("NO\n");
printf("%d %d\n%d %d\n", r, i, c1, x2);
flag = false;
break;
}
marks[p] = t;
}
if (!flag) break;
}
if (!flag) break;
}
if (!flag) continue;
printf("YES\n");
}
return 0;
}