题意: 数据库的表,找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;
}