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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

G將軍有一支訓(xùn)練有素的軍隊(duì),這個(gè)軍隊(duì)除開(kāi)G將軍外...

2019-11-11 01:42:02
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
此為藍(lán)橋杯2015校內(nèi)選拔第七題:G將軍有一支訓(xùn)練有素的軍隊(duì),這個(gè)軍隊(duì)除開(kāi)G將軍外,每名士兵都有一個(gè)直接上級(jí)(可能是其他士兵,也可能是G將軍)?,F(xiàn)在G將軍將接受一個(gè)特別的任務(wù),需要派遣一部分士兵(至少一個(gè))組成一個(gè)敢死隊(duì),為了增加敢死隊(duì)隊(duì)員的獨(dú)立性,要求如果一名士兵在敢死隊(duì)中,他的直接上級(jí)不能在敢死隊(duì)中。請(qǐng)問(wèn),G將軍有多少種派出敢死隊(duì)的方法。注意,G將軍也可以作為一個(gè)士兵進(jìn)入敢死隊(duì)。輸入格式:輸入的第一行包含一個(gè)整數(shù)n,表示包括G將軍在內(nèi)的軍隊(duì)的人數(shù)。軍隊(duì)的士兵從1至n編號(hào),G將軍編號(hào)為1。接下來(lái)n-1個(gè)數(shù),分別表示編號(hào)為2, 3, ..., n的士兵的直接上級(jí)編號(hào),編號(hào)i的士兵的直接上級(jí)的編號(hào)小于i。輸出格式:輸出一個(gè)整數(shù),表示派出敢死隊(duì)的方案數(shù)。由于數(shù)目可能很大,你只需要輸出這個(gè)數(shù)除10007的余數(shù)即可。樣例輸入131 1樣例輸出14樣例說(shuō)明這四種方式分別是:1. 選1;2. 選2;3. 選3;4. 選2, 3。樣例輸入271 1 2 2 3 3樣例輸出240解此題的思路如下:依照題目,下屬的直接上屬不能進(jìn)入敢死隊(duì),依照下圖,程序最終要求的是將右邊樹(shù)的葉子子節(jié)點(diǎn)個(gè)數(shù)求出,再減去所有人都不來(lái)的一種情況即可。                                         子函數(shù)基本流程:1、每次計(jì)數(shù)一次的條件,到達(dá)依據(jù)士兵編號(hào)記錄上屬的一維數(shù)組a[100001]的尾部,count++2、若此士兵已被訪問(wèn),則調(diào)用dfs,訪問(wèn)下一位士兵3、若此士兵未被訪問(wèn),則將其分為來(lái)與不來(lái)兩種情況(被訪問(wèn)意味著不能再次被訪問(wèn),包括兩種情況,情況1為編號(hào)為i的士兵來(lái)或不來(lái),此時(shí)visited[i]=1,情況2為士兵I為某個(gè)要來(lái)直接上屬的下屬是,此時(shí)visited[i]=2)具體C代碼如下,編譯通過(guò)的環(huán)境為DEV-C++:
#include "stdio.h"#include "stdlib.h"#include "string.h"static int count; //定義全局靜態(tài)變量,記錄總的情況數(shù)void dfs(int a[100001], int visited[100001], int i){	if (a[i] == -1){ //每次計(jì)數(shù)一次的條件,到達(dá)依據(jù)士兵編號(hào)記錄上屬的一維數(shù)組a[100001]的尾部,count++		count++;		return;	}	if (a[i] != -1 && visited[i] >= 1){ //若此士兵已被訪問(wèn),則調(diào)用dfs,訪問(wèn)下一位士兵		dfs(a, visited, ++i);	}	if (a[i] != -1 && visited[i] == 0){ //若此士兵未被訪問(wèn)		visited[i] = 1; //此士兵來(lái)時(shí)		for (int j = 0; a[j] != -1; j++){ //其下屬均將visited[j]=2,作為已被訪問(wèn)			if (a[j] == i){				visited[j] = 2;			}		}		dfs(a, visited, ++i);		i--; //此士兵不來(lái)時(shí),首先將上面假設(shè)他來(lái)的數(shù)據(jù)變回未方式的狀態(tài)		for (int j = 0; a[j] != -1; j++){			if (a[j] == i)				visited[j] = 0;			if (i < j && visited[j]==1) //此處需注意,標(biāo)號(hào)為1的,且i<j的才能恢復(fù)原狀,而標(biāo)號(hào)為2且i<j的不能恢復(fù)原狀				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ā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 寿光市| 永济市| 阳山县| 石柱| 商城县| 广南县| 咸丰县| 正安县| 克东县| 龙口市| 新密市| 阳山县| 信宜市| 贺州市| 彝良县| 元江| 阳春市| 玛曲县| 东乌| 永寿县| 桐乡市| 城口县| 涞水县| 龙井市| 安仁县| 阆中市| 盐山县| 时尚| 宜兰市| 墨玉县| 盐津县| 黎川县| 常熟市| 左权县| 桑日县| 连城县| 望都县| 澄城县| 天峨县| 扶沟县| 荣成市|