#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
最新推荐文章于 2019-03-27 15:31:55 发布