题意:判断是否有两行有相同的两列。 然后刚拿到这道题的时候想放到哪里呢? 然后这里是放到map里面,然后每一个相同的部分会对应一个常数,但是在不同列可能也有相同的部分呀?所以我们定义了一个map M[maxn],对每一列进行对应。然后我们vector 存的是对应的部分所对应的数字。我们最后进行扫描的对列进行枚举,然后从上往下判断。因为v里面存的就是行号嘛。 但是其中会总是WA,因为还有这样的一种情况 3 3 1 2 5 1 4 3 1 5 3 这个时候a=v[2][0]=0,b=v[2][2]=1,他们的行号不相同,那怎么办?我们判断一下,v[b][0]是否为a就好啦
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <vector> #include <map> using namespace std; #define maxn 10005 vector<int > v[maxn]; map <string, int > M[10]; string str; int h=0,n,m;; int id(string g,int k) { if(M[k].count(g)!=0) {return M[k][g];} M[k][g]=h; // cout<<M[k][g]<<endl; return M[k][g]; } void read() { char c; str.clear(); int k=0; for(;;) { c=getchar(); if(k==m) break; if(c=='\n'||c=='\r') { if(!str.empty()) v[h].push_back(id(str,k)); str.clear(); break; } else { if(c==','){ v[h].push_back(id(str,k)); k++; str.clear(); } else str+=c; } } } void solve() { int flag=0; for(int i=0;i<m;i++) { for(int j=i+1;j<m;j++) { for(int k=0;k<n;k++){ int a=v[k][i]; int b=v[k][j]; if(a<b) {//判断 if(v[b][i]==a) a=b; } else if(a>b) { if(b==v[a][j]) b=a;} if(a!=k&&b!=k&&a==b) { flag=1; printf("NO\n"); printf("%d %d\n",a+1,k+1); printf("%d %d\n",i+1,j+1); break; } } if(flag) break; } if(flag) break; } if(!flag) printf("YES\n"); } int main() { // freopen("E:\\input.txt","r",stdin); while(scanf("%d %d",&n,&m)!=EOF) { getchar(); for(int i=0;i<10;i++) M[i].clear(); for(int i=0;i<maxn;i++) v[i].clear(); for(h=0;h<n;h++) read(); solve(); } return 0; }然后看到紫书上说的是将两列的信息作为一个二元组放到map里。