zoukankan      html  css  js  c++  java
  • 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,不好判断是否是同性朋友

    代码如下:

    #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
    ",ans.size()); 
    		for(int i=0;i<ans.size();i++){
    			printf("%04d %04d
    ",ans[i].a,ans[i].b);
    		}
    		
    	}
    	
    	return 0;
    }
    

      

  • 相关阅读:
    原创:【微信小程序】发送消息模板教程(后台以PHP示例)
    【微信小程序】详解wx:if elif else的用法(搭配view、block)
    原创:微信小程序+WEB使用JS实现注册【60s】倒计时功能
    微信小程序的POST和GET请求方式的header区别
    什么是单例模式
    Spring bean的生命周期
    对Spring Bean了解一二
    匿名内部类了解一二
    Eclipse中如何查看使用的JDK版本
    什么是语法糖
  • 原文地址:https://www.cnblogs.com/zzlback/p/12594174.html
Copyright © 2011-2022 走看看