#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;}
新闻热点
疑难解答