一道刘汝佳入门经典【第二版】的例题,不过书上没有标程,利用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 */