华为笔试:矩阵相邻

匿名 (未验证) 提交于 2019-12-02 23:57:01

题目描述:

一个矩阵,5*5,取相邻(二个成员有一个边是相同的)的6个,输入一个6个成员列表,判断是否满足?

矩阵成员如下:

[[1,2,3,4,5],

[11,12,13,14,15],

[21,22,23,24,25],

[31,32,33,34,35],

[41,42,43,44,45]].

输入描述:

包含6个矩阵成员数组,如:1,2,3,4,5,11以一个空格分隔,支持多行

1,2,3,4,5,11

1,2,11,14,25,15

输出描述:

满足输出1,否则输出0,每一行输入一个输出

1

0

备注:

输入没有合法判断,每个成员不重复。

思路分析:

利用并查集实现。设定一个长度为6的数组,其中每个成员单独成组,接下来判断两两是否相邻,若相邻则合并为一组。最后判断是否存在孤立的组,若有则输出0,否则输出1。

代码:

 1 #include<iostream>  2 #include<vector>  3 #include<algorithm>  4 using namespace std;  5   6 vector<int>Tree(6);  7 int findRoot(int x){  8     if(Tree[x]==-1) return x;  9     int tmp=findRoot(Tree[x]); 10     Tree[x] = tmp; 11     return tmp; 12 } 13  14 int main(){ 15     int A[6]; 16     while(cin>>A[0]){ 17         for(int i=1;i<6;i++) cin>>A[i]; 18         for(int i=0;i<6;i++) Tree[i]=-1; 19         for(int i=0;i<6;i++){ 20             for(int j=i+1;j<6;j++){ 21                 int x=max(A[i],A[j]); 22                 int y=min(A[i],A[j]); 23                 if(x-y==1 || x-y==10){ 24                     int a=findRoot(i); 25                     int b=findRoot(j); 26                     if(a!=b) Tree[a]=b; 27                 } 28             } 29         } 30         int ans=count(Tree.begin(),Tree.end(),-1)==1?1:0; 31         cout<<ans<<endl; 32     } 33     return 0; 34 }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!