列表

详情


WY43. 字符迷阵

描述

注意:本题允许使用C/C++/Java/python进行解答,其他编程语言提交均视作无效处理。

字符迷阵是一种经典的智力游戏。玩家需要在给定的矩形的字符迷阵中寻找特定的单词。
在这题的规则中,单词是如下规定的:
1. 在字符迷阵中选取一个字符作为单词的开头;
2. 选取右方、下方、或右下45度方向作为单词的延伸方向;
3. 以开头的字符,以选定的延伸方向,把连续得到的若干字符拼接在一起,则称为一个单词

以图1为例,如果要在其中寻找单词"WORD",则绿色框所标示的都是合法的方案,而红色框所标示的都是不合法的方案。
现在的问题是,给出一个字符迷阵,及一个要寻找的单词,问能在字符迷阵中找到多少个该单词的合法方案。注意合法方案是可以重叠的,如图1所示的字符迷阵,其中单词"WORD"的合法方案有4种。

输入描述

输入的第一行为一个正整数T,表示测试数据组数。 接下来有T组数据。每组数据的第一行包括两个整数m和n,表示字符迷阵的行数和列数。接下来有m行,每一行为一个长度为n的字符串,按顺序表示每一行之中的字符。再接下来还有一行包括一个字符串,表示要寻找的单词。 数据范围: 对于所有数据,都满足1<=T<=9,且输入的所有位于字符迷阵和单词中的字符都为大写字母。要寻找的单词最短为2个字符,最长为9个字符。字符迷阵和行列数,最小为1,最多为99。 对于其中50%的数据文件,字符迷阵的行列数更限制为最多为20。

输出描述

对于每一组数据,输出一行,包含一个整数,为在给定的字符迷阵中找到给定的单词的合法方案数。

示例1

输入:

3
10 10
AAAAAADROW
WORDBBBBBB
OCCCWCCCCC
RFFFFOFFFF
DHHHHHRHHH
ZWZVVVVDID
ZOZVXXDKIR
ZRZVXRXKIO
ZDZVOXXKIW
ZZZWXXXKIK
WORD
3 3
AAA
AAA
AAA
AA
5 8
WORDSWOR
ORDSWORD
RDSWORDS
DSWORDSW
SWORDSWO
SWORD

输出:

4
16
5

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 304KB, 提交时间: 2021-09-19

#include <stdio.h>
#include <string.h>

int main()
{
    int T;
    while(scanf("%d",&T)!=EOF)
    {
        int mark=0;
        while(mark<T)
        {
            int m,n;
            scanf("%d %d",&m,&n);
            char s[m][n*3];
            int index=0;
            getchar();
            while(index<m)
            {
                scanf("%s",s[index++]);
            }
            char t[150];
            scanf("%s",t);
            int sum=0;
            for(int i=0;i<m;i++)
            {
                for(int j=0;j<n;j++)
                {
                    int k;
                    for(k=0;k<strlen(t);k++)
                    {
                        if(j+k>=n || s[i][j+k]!=t[k])
                            break;
                    }
                    if(k==strlen(t))
                        sum++;
                    for(k=0;k<strlen(t);k++)
                    {
                        if(i+k>=m || s[i+k][j]!=t[k])
                            break;
                    }
                    if(k==strlen(t))
                        sum++;
                    for(k=0;k<strlen(t);k++)
                    {
                        if(j+k>=n || i+k>=m || s[i+k][j+k]!=t[k])
                            break;
                    }
                    if(k==strlen(t))
                        sum++;
                }
            }
            printf("%d\n",sum);
            mark++;
        }
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2020-11-06

#include<stdio.h>
#include<string.h>
char mp[105][105],goal[105];
int len,m,n;
int check(int x,int y,int k)
{
	if(k==1)
	{
		for(int i=0;i<len;i++)
		{
			if(x+i>=m)return 0;
			if(mp[x+i][y]!=goal[i])return 0;
		}
	}
	else if(k==2)
	{
		for(int i=0;i<len;i++)
		{
			if(y+i>=n)return 0;
			if(mp[x][y+i]!=goal[i])return 0;
		}
	}
	else if(k==3)
	{
		for(int i=0;i<len;i++)
		{
			if(x+i>=m||y+i>=n)return 0;
			if(mp[x+i][y+i]!=goal[i])return 0;
		}
	}
	return 1;
}
int main()
{
	int t,sum;
	scanf("%d",&t);
	while(t--)
	{
		sum=0;
		scanf("%d%d",&m,&n);
		for(int i=0;i<m;i++)scanf("%s",mp[i]);
		scanf("%s",goal);
		len=strlen(goal);
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(mp[i][j]!=goal[0])continue;
				for(int k=1;k<=3;k++)sum+=check(i,j,k);
			}
		}
		printf("%d\n",sum);
	}
}

上一题