刘汝佳上传的代码没耐心看。。。就大致照着书上写的思路写了一个。。。一开始发现全写错了耗了半天。。。
定义一个pair,这个pair里有存两个队,字符串对和int对。每每读入一行的时候看看map中是否存在这个对。
自己感觉坑就是,一行中可能存在重复的字符
像这样:
2 4
a,b,a,b
a,b,c,d
第一行中存在两个字符串想等但列根本不想等的两对
下面是代码:
#include<algorithm>
#include<queue>
#include<iostream>
#include<vector>
#include<cstdio>
#include<set>
#include<sstream>
#include<cstring>
#include<map>
#include<queue>
using namespace std;
string save[10005][15];
set<pair<pair<string,string>,pair<int,int>>> git;
map<pair<pair<string,string>,pair<int,int>> , int> row;
int main(){
int n,m,i,j;
while(~scanf("%d%d",&n,&m)){
git.clear();
row.clear();
getchar();
for(i=0;i<n;i++){
char t[2000];
gets(t);
string in=t;
int len=0,r=0;
j=0;
while(in[r]!='\0'&&in[r]!='\n'){
len=0;
while(in[r]!=','&&in[r]!='\0'&&in[r]!='\n'){
r++;
len++;
}
save[i][j]=in.substr(r-len,len);
if(in[r]=='\n'||in[r]=='\0'){
break;
}
j++;
r++;
}
}
int flag=1;
pair<string,string> article;
pair<int,int> position;
pair<pair<string,string>,pair<int,int>> unit;
for(i=0;i<n;i++){
for(j=0;j<m-1;j++){
for(int k=j+1;k<m;k++){
article=make_pair(save[i][j], save[i][k]);
position=make_pair(j, k);
unit=make_pair(article, position);
if(git.count(unit)){
cout<<"NO"<<endl;
cout<<row[unit]+1<<" "<<i+1<<endl;
cout<<unit.second.first+1<<" "<<unit.second.second+1<<endl;
flag=0;
goto here;
}else{
git.insert(unit);
row[unit]=i;
}
}
}
}
here:
if(flag){
cout<<"YES"<<endl;
}
}
return 0;
}