題目描述:ios
一個矩陣,5*5,取相鄰(二個成員有一個邊是相同的)的6個,輸入一個6個成員列表,判斷是否知足?數組
矩陣成員以下:spa
[[1,2,3,4,5],code
[11,12,13,14,15],blog
[21,22,23,24,25],ci
[31,32,33,34,35],it
[41,42,43,44,45]].io
輸入描述:class
包含6個矩陣成員數組,如:1,2,3,4,5,11以一個空格分隔,支持多行stream
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 }