程序源码:
#include<iostream>
#include<set>
#include<map>
#include<vector>
#include<string>
using namespace std;
vector<string> vs;
set<string> ss;
string tables[10002][12];
int table[10002][12];
map<string,int> s2i;
map<int,int> v2r;
void split(const string& src,const string& sep,vector<string>& ans)
{
string str=src;
string substr;
string::size_type start=0,index;
ans.clear();
while(index!=string::npos)
{
index=str.find_first_of(sep,start);
if(index!=string::npos)
{
substr=str.substr(start,index-start);
ans.push_back(substr);
start=str.find_first_not_of(sep,index);
if(start==string::npos)
return;
}
}
substr=str.substr(start);
ans.push_back(substr);
}
struct twoint
{
int a;
int b;
twoint(int a,int b):a(a),b(b){};
bool operator < (const twoint& _A) const
{
if(a<_A.a)
return true;
if(a==_A.a)
return b<_A.b;
return false;
}
};
int main()
{
int n,m;
string haha;
while(cin>>n>>m){
ss.clear();
getline(cin,haha);
for(int i=0;i<n;i++)
{
string a;
getline(cin,a);
split(a,",",vs);
for(int j=0;j<vs.size();j++)
{
tables[i][j]=vs[j];
ss.insert(vs[j]);
}
}
set<string>::iterator si;
int i=0;
for(si=ss.begin();si!=ss.end();si++)
s2i.insert(map<string,int>::value_type(*si,i++));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
table[i][j]=s2i[tables[i][j]];
}
}
int flag=0;
for(int i=0;i<m;i++)
{
if(1==flag)break;
for(int j=i+1;j<m;j++)
{
if(1==flag)break;
map<twoint,int> ti2i;
for(int k=0;k<n;k++)
{
map<twoint,int>::iterator ite;
twoint t(table[k][i],table[k][j]);
ite=ti2i.find(t);
if(ite!=ti2i.end())
{
cout<<"NO"<<endl;
cout<<ti2i[t]+1<<" "<<k+1<<endl;
cout<<i+1<<" "<<j+1<<endl;
flag=1;
break;
}
else
ti2i.insert(map<twoint,int>::value_type(t,k));
}
}
}
if(flag!=1)
cout<<"YES"<<endl;
}
return 0;
}
本程序是基于C++的STL来实现的。由于输入的字符串可能包含空格,所以用getline()函数整行读入。然后自己编写了一个split函数,把一行中的每一列的内容分割出来,将分割出来的字符串存到tables数组中,同时放到一个set<string>型容器中。然后把set<string>里面的字符串映射为int型存到map<string,int>中。根据映射关系,得到由tables映射的数组table,。每次枚举不同的两列,然后从上到下扫描table的行,每遇到一个新的行,就用这两个数据构建一个二元组结构体,然后把该二元组映射为改行的值,存到map<twoint,int>型的2iti中。如果能在存进去之前已经找到了该二元组已经有映射的值,那么说明不是PNF型表格了。之前映射的行和当前的行即为两个行号,列号即为当前列号。