【天梯赛L2-016】愿天下有情人都是失散多年的兄妹(递归)
題目鏈接
L2-016?愿天下有情人都是失散多年的兄妹(25?分)
呵呵。大家都知道五服以內不得通婚,即兩個人最近的共同祖先如果在五代以內(即本人、父母、祖父母、曾祖父母、高祖父母)則不可通婚。本題就請你幫助一對有情人判斷一下,他們究竟是否可以成婚?
輸入格式:
輸入第一行給出一個正整數N(2 <= N <= 10^4^),隨后N行,每行按以下格式給出一個人的信息:
本人ID 性別 父親ID 母親ID
其中ID是5位數字,每人不同;性別M代表男性、F代表女性。如果某人的父親或母親已經不可考,則相應的ID位置上標記為-1。
接下來給出一個正整數K,隨后K行,每行給出一對有情人的ID,其間以空格分隔。
注意:題目保證兩個人是同輩,每人只有一個性別,并且血緣關系網中沒有亂倫或隔輩成婚的情況。
輸出格式:
對每一對有情人,判斷他們的關系是否可以通婚:如果兩人是同性,輸出“Never Mind”;如果是異性并且關系出了五服,輸出“Yes”;如果異性關系未出五服,輸出“No”。
輸入樣例:
24 00001 M 01111 -1 00002 F 02222 03333 00003 M 02222 03333 00004 F 04444 03333 00005 M 04444 05555 00006 F 04444 05555 00007 F 06666 07777 00008 M 06666 07777 00009 M 00001 00002 00010 M 00003 00006 00011 F 00005 00007 00012 F 00008 08888 00013 F 00009 00011 00014 M 00010 09999 00015 M 00010 09999 00016 M 10000 00012 00017 F -1 00012 00018 F 11000 00013 00019 F 11100 00018 00020 F 00015 11110 00021 M 11100 00020 00022 M 00016 -1 00023 M 10012 00017 00024 M 00022 10013 9 00021 00024 00019 00024 00011 00012 00022 00018 00001 00004 00013 00016 00017 00015 00019 00021 00010 00011?
輸出樣例:
Never Mind Yes Never Mind No Yes No Yes No No?
解題思路:
參考:https://blog.csdn.net/priestessofbirth/article/details/78277297
1.一開始的時候定義一個足夠大的字符串數組,值存放對應編號人的性別,別的不存儲,后面需要用到性別的判定。
2.用一個父親數組存放該節點的父親,用一個母親數組存放該節點的母親,但不管是父親還是母親一定要記得設置性別,要不然會有一些點過不去,你知道父母親性別,系統可不知道。
3.全部存儲完之后就是輸入數據要你判斷了,首先判斷是否為同性,同性就不用管了,人家可是真愛,沒有任何問題,不能拆散。異性那就需要判斷了。
4.我們先判斷雙方父母是否可以考證,如果其中有一個不可考證那就恭喜你們了,為了真愛就算這一步判斷過了,沒有任何問題,如果都可以考證,再判斷男女雙方的父親和母親是否為一個人,是一個人那就肯定不行了,這可不是皇族。如果不是那就趕緊計算一下這是第幾代了,滿了五代就趕緊退出,匯報沒有問題。沒到五代就別高興的太早了,判斷男方父親和女方父親的父母情況,男方母親和女方母親的情況,男方父親和女方母親的情況。
?
代碼:
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+5; int a[maxn],father[maxn],mother[maxn]; char sex[maxn]; int judge(int x,int y,int num) {if(x==-1 && y==-1)//善意的愛護,如果無法考證就算是符合 return 1;if((mother[x]!=-1 && mother[x]==mother[y]) || (father[x]!=-1 && father[x]==father[y]))return 0;//父母親可以考證,且相同,那可是不行的num++;if(num>=4)//超過了五代就牽手成功了,哈哈哈,有情人終成眷屬了 return 1;return judge(mother[x],mother[y],num)&&//別激動,判斷一下你們的父母是不是近親judge(father[x],father[y],num)&&judge(mother[x],father[y],num)&&//判斷你的老媽和他的老爸是不是近親judge(father[x],mother[y],num);//判斷你的老爸和他的老媽是不是近親 } int main() {int n,m;memset(father,-1,sizeof(father));memset(mother,-1,sizeof(mother));scanf("%d",&n);while(n--){int x,f,m;char ch;scanf("%d",&x);getchar();scanf("%c",&sex[x]);scanf("%d%d",&f,&m);father[x]=f;sex[f]='M';//注意一下爸媽也是要設置性別哦mother[x]=m;sex[m]='F';}scanf("%d",&m);while(m--){int x,y;scanf("%d%d",&x,&y);if(sex[x]==sex[y])printf("Never Mind\n");else{if(judge(x,y,0))printf("Yes\n");elseprintf("No\n");}}return 0; }?
總結
以上是生活随笔為你收集整理的【天梯赛L2-016】愿天下有情人都是失散多年的兄妹(递归)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode790.多米诺和托米诺平
- 下一篇: 2006河北高考五分一档统计表