题意: 数据库的表,找r1,r2,c1,c2 使表中(r1,c1) = (r2,c1) (r1,c2) = (r2,c2) map的应用 给每个字符串编个号,这样比较便于处理,也能减少时间。 而且最好两个格子里的内容一起比较,所以用到了pair<> 这样找上面的行就不用判断情况了
之前思考的是开一个map数组来处理每一列出现的字符,但是发现这种在处理这种数据时出现了问题,因为两个的行数很有可能不一样,必须得再判断: 3 3 1,2,3 1,1,1 1,5,1
#include <bits/stdc++.h> using namespace std; #define maxn 10010 #define Pair pair<int,int> vector<int> data[maxn]; map<string,int> ID; map<Pair,int> vis; int row,col; void init() { for(int i = 1; i < maxn ;i++) data[i].clear(); ID.clear(); } int getid(char s[200]) { if(ID.count(s)) return ID[s]; else { int i = ID.size(); ID.insert(pair<string,int>(s,i)); return i; } } int main() { // freopen("D://in.txt","r",stdin); while(~scanf("%d",&row)) { scanf("%d\n",&col); init(); char s[200]; for(int i = 1; i <= row; i++) { char c; int num = 0; while(c = getchar()) { if( c == ',' || c =='\r' || c == '\n') { s[num] = '\0'; int id = getid(s); data[i].push_back(id); if(c == '\r' || c == '\n') break; num = 0; } else s[num++] = c; } } int r1 = -1,r2 = -1,c1 = -1,c2 = -1; int flag = 0; for(int j = 0; j < col; j++) { for(int k = j+1; k < col; k++) { vis.clear(); for(int i = 1; i <= row; i++) { int idj = data[i][j],idk = data[i][k]; Pair temp = Pair(idj,idk); if(vis.count(temp) == 0) vis[temp] = i; else { printf("NO\n"); printf("%d %d\n%d %d\n",vis[temp],i,j+1,k+1); flag = 1;break; } } if(flag) break; } if(flag) break; } if(!flag) printf("YES\n"); } return 0; }