核心思想:利用map数据结构优化搜索
1、题意:
给出一个n行m列的数据库,是否存在两个不同行r1,r2和两个不同列c1,c2,使得这两行和这两列相同(即(r1,c1)和(r2,c1)相同,(r1,c2)和(r2,c2)相同)。
2、思路:
- 枚举2列的组合,遍历行。
- 通过map<string,int>为字符串赋予id
- 通过map<pair<int,int>,int>将两列的数据映射到行中
3、注意事项:
1、此问题输入方法
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
{
value.clear();
while((ch=getchar())&&ch!='\n'&&ch!=',')
{
value.push_back(ch);
}
if(id.count(value))table[i][j]=id[value];
else table[i][j]=id[value]=++num;
}//输入
2、注意比较两列的任意两行前清空row
4、完整代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<map>
using namespace std;
/******************************************
uva1592
数据库
******************************************/
typedef pair<int,int> tc;
int table[10010][15];
int num;
map<string,int>id;
map<tc,int>row;
string value;
char ch;
int main()
{
int n,m;
while(cin>>n>>m)
{
num=0;
id.clear();
getchar();
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
{
value.clear();
while((ch=getchar())&&ch!='\n'&&ch!=',')
{
value.push_back(ch);
}
if(id.count(value))table[i][j]=id[value];
else table[i][j]=id[value]=++num;
}//输入
bool flag=true;
for(int j=1;j<=m&&flag;j++)
{
for(int k=j+1;k<=m&&flag;k++)
{
row.clear();
for(int i=1;i<=n&&flag;i++)
{
tc ntc;
ntc.first=table[i][j];
ntc.second=table[i][k];
if(!row.count(ntc))row[ntc]=i;
else
{
printf("NO\n%d %d\n%d %d\n",row[ntc],i,j,k);
flag=false;
}
}
}
}
if(flag)
printf("YES\n");
}
return 0;
}