国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

G將軍有一支訓練有素的軍隊,這個軍隊除開G將軍外...

2019-11-11 02:57:11
字體:
來源:轉載
供稿:網友
此為藍橋杯2015校內選拔第七題:G將軍有一支訓練有素的軍隊,這個軍隊除開G將軍外,每名士兵都有一個直接上級(可能是其他士兵,也可能是G將軍)。現在G將軍將接受一個特別的任務,需要派遣一部分士兵(至少一個)組成一個敢死隊,為了增加敢死隊隊員的獨立性,要求如果一名士兵在敢死隊中,他的直接上級不能在敢死隊中。請問,G將軍有多少種派出敢死隊的方法。注意,G將軍也可以作為一個士兵進入敢死隊。輸入格式:輸入的第一行包含一個整數n,表示包括G將軍在內的軍隊的人數。軍隊的士兵從1至n編號,G將軍編號為1。接下來n-1個數,分別表示編號為2, 3, ..., n的士兵的直接上級編號,編號i的士兵的直接上級的編號小于i。輸出格式:輸出一個整數,表示派出敢死隊的方案數。由于數目可能很大,你只需要輸出這個數除10007的余數即可。樣例輸入131 1樣例輸出14樣例說明這四種方式分別是:1. 選1;2. 選2;3. 選3;4. 選2, 3。樣例輸入271 1 2 2 3 3樣例輸出240解此題的思路如下:依照題目,下屬的直接上屬不能進入敢死隊,依照下圖,程序最終要求的是將右邊樹的葉子子節(jié)點個數求出,再減去所有人都不來的一種情況即可。                                         子函數基本流程:1、每次計數一次的條件,到達依據士兵編號記錄上屬的一維數組a[100001]的尾部,count++2、若此士兵已被訪問,則調用dfs,訪問下一位士兵3、若此士兵未被訪問,則將其分為來與不來兩種情況(被訪問意味著不能再次被訪問,包括兩種情況,情況1為編號為i的士兵來或不來,此時visited[i]=1,情況2為士兵I為某個要來直接上屬的下屬是,此時visited[i]=2)具體C代碼如下,編譯通過的環(huán)境為DEV-C++:
#include "stdio.h"#include "stdlib.h"#include "string.h"static int count; //定義全局靜態(tài)變量,記錄總的情況數void dfs(int a[100001], int visited[100001], int i){	if (a[i] == -1){ //每次計數一次的條件,到達依據士兵編號記錄上屬的一維數組a[100001]的尾部,count++		count++;		return;	}	if (a[i] != -1 && visited[i] >= 1){ //若此士兵已被訪問,則調用dfs,訪問下一位士兵		dfs(a, visited, ++i);	}	if (a[i] != -1 && visited[i] == 0){ //若此士兵未被訪問		visited[i] = 1; //此士兵來時		for (int j = 0; a[j] != -1; j++){ //其下屬均將visited[j]=2,作為已被訪問			if (a[j] == i){				visited[j] = 2;			}		}		dfs(a, visited, ++i);		i--; //此士兵不來時,首先將上面假設他來的數據變回未方式的狀態(tài)		for (int j = 0; a[j] != -1; j++){			if (a[j] == i)				visited[j] = 0;			if (i < j && visited[j]==1) //此處需注意,標號為1的,且i<j的才能恢復原狀,而標號為2且i<j的不能恢復原狀				visited[j] = 0;		}		dfs(a, visited, ++i);	}}int main(){	int n, a[100001], i = 0, j = 1, visited[100001] = { 0 };	char temp[100000];	a[0] = -2;	scanf("%d", &n);	if(n!=1&&n>0){ //輸入格式控制		getchar();	while (1){		temp[i++] = getchar();		if (temp[i - 1] == ' '){			temp[i - 1] = '/0';			a[j++] = atoi(temp) - 1;			strcpy(temp, "");			i = 0;		}		if (temp[i - 1] == '/n'){			temp[i - 1] = '/0';			a[j++] = atoi(temp) - 1;			strcpy(temp, "");			i = 0;			break;		}	}	a[j] = -1;	dfs(a, visited, i);	PRintf("%d", (count - 1) % 10007);	}	if(n==1){ //考慮只有將軍一人的情況		printf("%d", n);		}	if(n<0){		printf("Unvalid input!");	}		return 0;}
上一篇:文章標題

下一篇:文章標題

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 桑日县| 溧水县| 长岭县| 正镶白旗| 吴堡县| 墨竹工卡县| 延吉市| 泉州市| 林州市| 怀来县| 翼城县| 襄垣县| 阳曲县| 大荔县| 柘城县| 锡林郭勒盟| 莒南县| 江华| 黄梅县| 长子县| 明溪县| 莒南县| 金沙县| 宜兰市| 北安市| 洪湖市| 海南省| 三原县| 岳池县| 威宁| 罗定市| 伊宁市| 岑巩县| 揭阳市| 上饶市| 庆云县| 益阳市| 永定县| 大冶市| 诏安县| 斗六市|