#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;}
新聞熱點
疑難解答