ZOJ1011

#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");  
        }  
    }  
}  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值