麻烦点,NB的人不要错过哟!!
有一个m行*n列的方格,m和n都不大于50,在里面找到完全连着的需要的单词,横、竖、斜、朝各个方向都可以,第一行输入一个数字表明有几组方格,然后空一行输入m和n,在输入一组方格,接下来输入k表示有几个要找的单词,每行输入一个要找的单词。输出就是找到的单词首字母的横纵坐标了,空格隔开,如果找到大于一个输出最上面最左边的。
第一个数字1是表示有多少个测试,后面的8 11表示下面是一个8行11列的字符数组(无任何的顺序,且不考虑大小写之差)。后面的4表示有四个单词需要在上面的矩阵中找出(顺序要相同,当然可以是横着的,竖着的,或是邪着的,倒着的)。
例如:输入
abcDEFGhigg
hEbkWalDork
FtyAwaldORm
FtsimrLqsrc
byoArBeDeyv
Klcbqwikomk
strEBGadhrb
yUiqlxcnBjf
4
Waldorf
Bambi
Betty
Dagbert
输出:
2 5
2 3
1 2
7 8
我的程序:
#include<stdio.h>
#include<string.h>
int main()
{int i,j,k,m,M,n,t,l;static int c[50]={0};char a[50][50],b[50][50];
scanf("%d",&t);
for(k=0;k<t;k++)
{scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
for(j=0;j<n+1;j++)
scanf("%c",a[i][j]);
scanf("%d",&M);
for(i=0;i<M;i++)
scanf("%s",&b[i]);
for(i=0;i<M;i++)
c[i]=strlen(b[i]);
for(i=0;i<m;i++)
for(j=1;j<n+1;j++)
if(a[i][j]>='A'&&a[i][j]<='Z')
a[i][j]=a[i][j]+32;
for(i=0;i<M;i++)
for(j=0;j<c[i];j++)
if(b[i][j]>='A'&&b[i][j]<='Z')
b[i][j]=b[i][j]+32;
for(l=0;l<M;l++)
{
for(i=0;i<m;i++)
for(j=1;j<n+1;j++)
if(a[i][j]==b[l][0])
{ if(c[l]<=n+1-j&&a[i][j+c[l]-1]==b[l][c[l]-1])printf("%d %d\n",i+1,j);
if(c[l]<=j&&a[i][j-c[l]+1]==b[l][c[l]-1])printf("%d %d\n",i+1,j);
if(c[l]<=i+1&&a[i-c[l]+1][j]==b[l][c[l]-1])printf("%d %d\n",i+1,j);
if(c[l]<=m-i&&a[i+c[l]-1][j]==b[l][c[l]-1])printf("%d %d\n",i+1,j);
if(c[l]<=i+1&&c[l]<=j&&a[i-c[l]+1][j-c[l]+1]==b[l][c[l]-1])printf("%d %d\n",i+1,j);
if(c[l]<=n-j+1&&c[l]<=i+1&&a[i-c[l]+1][j+c[l]-1]==b[l][c[l]-1])printf("%d %d\n",i+1,j);
if(c[l]<=m-i&&c[l]<=j&&a[i+c[l]-1][j-c[l]+1]==b[l][c[l]-1])printf("%d %d\n",i+1,j);
if(c[l]<=m-i&&c[l]<=n-j+1&&a[i+c[l]-1][j+c[l]-1]==b[l][c[l]-1])printf("%d %d\n",i+1,j);
}
}
if(k==n-1)break;
else printf("\n");
}
return 0;
}
出现了无效内存引用,不会改了