WY43. 字符迷阵
描述
输入描述
输入的第一行为一个正整数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); } }