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

首頁 > 學院 > 開發設計 > 正文

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

2019-11-11 01:46: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解此題的思路如下:依照題目,下屬的直接上屬不能進入敢死隊,依照下圖,程序最終要求的是將右邊樹的葉子子節點個數求出,再減去所有人都不來的一種情況即可。                                         子函數基本流程:1、每次計數一次的條件,到達依據士兵編號記錄上屬的一維數組a[100001]的尾部,count++2、若此士兵已被訪問,則調用dfs,訪問下一位士兵3、若此士兵未被訪問,則將其分為來與不來兩種情況(被訪問意味著不能再次被訪問,包括兩種情況,情況1為編號為i的士兵來或不來,此時visited[i]=1,情況2為士兵I為某個要來直接上屬的下屬是,此時visited[i]=2)具體C代碼如下,編譯通過的環境為DEV-C++:
#include "stdio.h"#include "stdlib.h"#include "string.h"static int count; //定義全局靜態變量,記錄總的情況數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--; //此士兵不來時,首先將上面假設他來的數據變回未方式的狀態		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;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滕州市| 定陶县| 谷城县| 东方市| 涟源市| 德兴市| 盐源县| 亳州市| 龙岩市| 三亚市| 长宁县| 曲阳县| 新疆| 富民县| 黄龙县| 敦煌市| 日土县| 柳江县| 寻乌县| 沧源| 康乐县| 应城市| 沧源| 文水县| 海南省| 白城市| 双牌县| 晋宁县| 陕西省| 中卫市| 正定县| 兴国县| 黑河市| 远安县| 建始县| 木兰县| 大兴区| 新密市| 弥勒县| 神池县| 琼海市|