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; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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)