Database

也可以查看我的个人博客
题目链接

题目大意:给出一个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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值