#include <stdio.h> #include <stdlib.h> #include <memory.h> #include <string.h> int n, m, k, lev;//树的层数 int transition[155][155];//存放表格中数据 char tree[11][2222]; int dfs(int signal, int flag, int level)//flag为树中字母下标,至于下面为什么是2*flag和2*flag+2,因为字母间都有一个空格 { if(level == lev + 1) { if(signal >= n - m) return 1; else return 0; } if(tree[level][flag] == '*') { if(signal >= n - m) return 1; else return 0; } int j, jj; for(j = 0; transition[signal * k + tree[level][flag] - 'a'][j] < 15; j++);//把transition数组所有元素初始大值,假如为transition[4][1](即表中(1,b)数据),那此时j=4 for(jj = 0; jj < j; jj += 2) { if(dfs(transition[signal * k + tree[level][flag] - 'a'][jj], 2 * flag, level + 1) && dfs(transition[signal * k + tree[level][flag] - 'a'][jj + 1], 2 * flag + 2, level + 1)) return 1; } return 0; } int main(void) { int i, j, cnt, cas = 0; char nk[155][155]; while(scanf("%d%d%d", &n, &m, &k), n) { if(cas) printf("\n"); printf("NTA%d:\n", ++cas); memset(transition, 1, sizeof transition);//初始大值 memset(nk, 0, sizeof nk); memset(tree, 0, sizeof tree); getchar(); for(i = 0; i < n * k; i++) { gets(nk[i]); cnt = 0; for(j = 0; j < strlen(nk[i]); j++) { if(nk[i][j] >= '0' && nk[i][j] < n + '0')//把所有数字存放到transition数组中 transition[i][cnt++] = nk[i][j] - '0'; } } while(scanf("%d", &lev) && lev != -1) { getchar(); for(i = 0; i <= lev; i++) gets(tree[i]); if(dfs(0, 0, 0)) printf("Valid\n"); else printf("Invalid\n"); } } }
转载请标明出处:ZOJ1011
文章来源: ZOJ1011