华为笔试:矩阵相邻
题目描述:
一个矩阵,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 }