一道刘汝佳入门经典【第二版】的例题,不过书上没有标程,利用STL函数进行转换
大体 思路 是对 2列进行枚举,之后从上往下对行进行分析
重要的地方就是 利用map 判重
还有就是 如果结果是NO,只需要打印出一组数据,不需要全部打出来(因为这个RE了好几次)
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<set>
#include<stack>
#include<queue>
#include<list>
using namespace std;
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
int m,n;
#define X 10000 + 5
#define Y 10 + 5
#define Z 80 + 5
#define T 100000 + 100
char mat[X][Y][Z];
int main(){
while(scanf("%d%d",&n,&m) != EOF){
getchar();
int ans_x1,ans_x2;
int ans_y1,ans_y2;
int size_ans = 0;
for(int i = 0 ; i < n ; i++){
char str[Z * Y];
gets(str);
int L = strlen(str);
for(int j = 0 , k = 0,size = 0; j < L; j ++){
if(str[j] == ','){
mat[i][k++][size] = '\0';
size = 0;
}
else if(j == L - 1){
mat[i][k][size++] = str[j];
mat[i][k++][size] = '\0';
size = 0;
}
else
mat[i][k][size++] = str[j];
}
}
for(int i = 0 ; i < m ; i ++){
for(int j = i + 1; j < m; j ++){
map<string,int>ID_Card;
for(int k = 0 ; k < n ; k++){
string str = "";
str += mat[k][i];
str += ",";
str += mat[k][j];
if(ID_Card.count(str)){
ans_x1 = ID_Card[str] + 1;
ans_x2 = k + 1;
ans_y1 = i + 1;
ans_y2 = j + 1;
size_ans = 1;
break;
}
else {
ID_Card[str] = k;
}
}
if(size_ans) break;
}
if(size_ans) break;
}
if(size_ans > 0) {
printf("NO\n");
printf("%d %d\n",ans_x1,ans_x2);
printf("%d %d\n",ans_y1,ans_y2);
}
else
printf("YES\n");
}
return 0;
}
/*
测试数据:
5 5
1,2,3,4,5
1,2,3,5,6
1,3,5,5,6
1,1,1,1,1
2,2,2,2,2
5 5
1,2,3,4,5
2,3,4,5,6
6,7,8,9,10
X,X,X,X,X
6,7,X,X,X
*/