pat 1139 First Contact (30分) 题目详解

这道题目给的输入数据  18条,如果没看懂题目意思,去把input数据关系图画出来再分析output,是非常麻烦的(我试过画出18组关系图,非常混乱),然后参考的别的大佬的代码。

 

其实这道题目的题目意思,在开头引言已经说明白了,题目意思大致如下:

 

如果一个人A,喜欢一个人D,A害羞不好意思直接和D说话,A会去找A的同性好朋友B,然后B去找B的好朋友C,但是前提是C是D的同性好朋友,好绕啊。

 

也就是A和B是同性朋友,C和D也是同性朋友,只要B和C也是朋友,就满足条件。但要排除 A和D直接是朋友的情况。

 

那么我们在处理输入的时候,只要把同性朋友存下来,然后用maps去存朋友关系(不管同性异性),因为要留着去判断B和C是否是朋友关系。

 

但要注意一点就是,开始输入18对关系是,不能去用int输入,用string输入,因为-0000,和+0000 int输入得到的都是0,不好判断是否是同性朋友

 

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<map>
#include<set>
#include<queue>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
int n,m,k;
vector<int> G[10000];
map<int,int> maps;
 
typedef struct Node{
    int a;
    int b;
}Node;
 
bool cmp(Node first,Node second){
    //从小到大排序   
    if(first.a != second.a){
        return first.a < second.a;
    }else{
        return first.b < second.b;
    }
}
 
int main(){
 
#if ONLINE_JUDGE
#else
    freopen("C:\\Users\\zzloyxt\\Desktop\\1.txt","r",stdin);   
#endif 
    scanf("%d %d",&n,&m);
    string a,b;
    int a_int,b_int;  //保存各自的int类型
    while(m--){
        cin >> a >> b; 
        //将a,b转成int类型
        sscanf(a.c_str(),"%d",&a_int);
        sscanf(b.c_str(),"%d",&b_int);
        a_int = abs(a_int);
        b_int = abs(b_int);
         
        if(a.length() == b.length()){   //a和b是同性朋友,都没有-号,或者都有-号
            G[a_int].push_back(b_int);
            G[b_int].push_back(a_int);
        }
        maps[10000* a_int + b_int] = maps[10000*b_int + a_int] = 1;  //保存朋友关系
    }
     
    scanf("%d",&k);
    while(k--){
        cin >> a >> b; 
        //将a,b转成int类型
        sscanf(a.c_str(),"%d",&a_int);
        sscanf(b.c_str(),"%d",&b_int);
        a_int = abs(a_int);
        b_int = abs(b_int);
        vector<Node> ans;
        for(int i=0;i<G[a_int].size();i++){
            for(int j=0;j<G[b_int].size();j++){
                if(G[a_int][i] == b_int || G[b_int][j] == a_int){
                    continue//a和b本身是朋友
                }else{
                    if(maps[10000 * G[a_int][i] + G[b_int][j]] == 1){ 
                        // a的朋友和b的朋友是朋友关系
                        Node node = {G[a_int][i],G[b_int][j]};
                        ans.push_back(node);                   
                    }
                }
                                 
            }
        }
        sort(ans.begin(),ans.end(),cmp);
        printf("%d\n",ans.size());
        for(int i=0;i<ans.size();i++){
            printf("%04d %04d\n",ans[i].a,ans[i].b);
        }
         
    }
     
    return 0;
}

  

 

posted @   my日常work  阅读(563)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示