题目大意:给出一个n行m列的表,每一行中,相邻两列的值以逗号分隔,请你判断,这个表是否存在两行,r1 , r2,使得某两列c1,c2,满足关系**(r1,c1) = (r2,c1) , (r1,c2) = (r2,c2)** ,英语不好一开始没翻译出来这个等式( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃,以为就是找两个重复存在的值,找到他们的行和列就行了(╯‵□′)╯︵┴─┴
思路:枚举c1和c2,接着在枚举行r,将(r , c1) 和 (r , c2) 作为一个二元组存入map中,如果这个二元组之前存在过,那么当前行数和map中对应二元组的值就是r1和r2
代码:
[题目链接](https://vjudge.net/problem/UVA-1592)
题目大意:给出一个n行m列的表,每一行中,相邻两列的值以逗号分隔,请你判断,这个表是否存在两行,r1 , r2,使得某两列c1,c2,满足关系**(r1,c1) = (r2,c1) , (r1,c2) = (r2,c2)** ,英语不好一开始没翻译出来这个等式( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃,以为就是找两个重复存在的值,找到他们的行和列就行了(╯‵□′)╯︵┴─┴
思路:枚举c1和c2,接着在枚举行r,将(r , c1) 和 (r , c2) 作为一个二元组存入map中,如果这个二元组之前存在过,那么当前行数和map中对应二元组的值就是r1和r2
代码:
```cpp
#include <map>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10010;
typedef pair < string , string > PSS;
int n , m;
string table[N][15];
map < PSS , int> tmp;
int main(void)
{
while(scanf("%d %d",&n , &m) != EOF)
{
getchar();//吸收换行符
for(int i = 0 ; i < n ; ++ i)
{
for(int j = 0 ; j < m ; ++ j)
{
char c;
string s = "";
while(true)//一直读取,直到逗号或者换行符
{
c = getchar();
if(c == '\n' || c == ',') break;
s += c;
}
table[i][j] = s;//记录
}
}
bool flag = false;
for(int i = 0 ; i < m ; ++ i)//枚举c1
{
for(int j = 0 ; j < m ; ++ j)//枚举c2
{
if(i == j) continue;
tmp.clear();
for(int k = 0 ; k < n ; ++ k)//枚举行
{
//如果这个二元组之前没有出现过,直接添加到map中
if(tmp.count({table[k][i] , table[k][j]}) == 0) tmp[{table[k][i] , table[k][j]}] = k;
else//否则就代表找到了一个结果
{
flag = true;
int r1 , r2 = k , c1 = i , c2 = j;
for(auto f : tmp)
{
if(f.first.first == table[k][i] && f.first.second == table[k][j] && f.second != r2)
{
r1 = f.second;
break;
}
}
printf("NO\n%d %d\n%d %d\n",r1 + 1,r2 + 1,c1 + 1,c2 + 1);
break;
}
}
if(flag) break;
}
if(flag) break;
}
if(!flag) printf("YES\n");
}
return 0;
}