背景:第一因为找到结果之后没有及时的停止查找而wa了一发,改正后ac。
思路:首先对读入的每一个string,设置一个独特的ID,这样就把string变为int,后来比较的时候就会简化很多,设置ID的时候用map来赋予每一种string对应一个独特的ID。然后构建一个key为pair<int,int>的map,因为行比较多列比较少(列的数为10),就枚举列的所有组合,然后对每组组合来进行map判重。
我的代码;
#include <set> #include <stack> #include <queue> #include <vector> #include <cstdio> #include <map> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #define LL long long int using namespace std; const int M=42,INF=0x3fffffff; int n,m,diagram[10009][11]; int main(void){ l1: while(~scanf("%d%d",&n,&m)){ getchar(); map<string,int> m1; int ID=1; for(int i=1;i <= n;i++){ for(int j=1;j <= m;j++){ string s1; while(true){ char c=getchar(); if(c == ',' || c == '\n') break; s1.push_back(c); } //cout << s1 <<endl; if(m1.count(s1)) diagram[i][j]=m1[s1]; else{ m1[s1]=ID++; diagram[i][j]=ID-1; } } } bool flag=false; for(int i=1;i <= m;i++){ for(int j=i+1;j <= m;j++){ pair<int,int> p1; map<pair<int,int>,int> m2; for(int k=1;k <= n;k++){ p1.first=diagram[k][i]; p1.second=diagram[k][j]; if(m2.count(p1)){ flag=true; printf("NO\n%d %d\n%d %d\n",m2[p1],k,i,j); goto l1; }else{ m2[p1]=k; } } } } if(!flag) printf("YES\n"); } return 0; }
原文地址:http://blog.csdn.net/jibancanyang/article/details/44885791