题目描述:
一个矩阵,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 }