其实这道题目,只要是明白了意思,实现起来很简单,不需要什么高深的算法,但却很容易出错,尤其在处理从八个方向比对字符串的时候,要注意各个量的变化,变了的要进行还原,最后去最值的时候,有两个过程,一是选行最小的那个,二是如果两个开头的字母所在的行相同的时候,要在进行比较列的大小,选列小的那个。
在使用的全局变量的时候,在定义局部变量的时候,不要重复定义,否则编译时虽然不会出错,在运行出结果的时候,却出错,错误点很难查到。所以在编写的时候,就要注意。
下面是我的代码 ,有点长,请各位指教:
#include <stdio.h>
#include <string.h>
char s1[100][100],s2[100];
int a[100000],b[100000],flag;
int n,m;
int main()
{
void f1(int x,int y);
int i,j,x,k1,k2,min,key1,key2,z;
scanf("%d",&x);
while(x--)
{
scanf("%d %d",&n,&m);
for(i=0;i<=n-1;i++)
{
scanf("%s",s1[i]);
}
scanf("%d",&z);
while(z--)
{
min=1000000;
scanf("%s",s2);
flag=0;
k1=0;
k2=-1;
for(i=k1;i<=n-1;)
{
for(j=k2+1;j<=m-1;)
{
if(s1[i][j]>='a'&&s1[i][j]<='z')
{
if(s1[i][j]==s2[0]||s1[i][j]-32==s2[0])
{
k1=i;
k2=j;
break;
}else
{
j+=1;
}
}else if(s1[i][j]>='A'&&s1[i][j]<='Z')
{
if(s1[i][j]==s2[0]||s1[i][j]+32==s2[0])
{
k1=i;
k2=j;
break;
}else
{
j+=1;
}
}
}
if(j==m)
{
k2=-1;
i+=1;
}else
{
f1(k1,k2);
i=k1;
}
}
for(i=0;i<=flag-1;i++)
{
if(a[i]<min)
{
min=a[i];
key1=b[i];
key2=i;
}else if(a[i]==min)
{
min=a[i];
if(b[i]<key1)
{
key1=b[i];
key2=i;
}
}
}
printf("%d %d\n",a[key2],key1);
}
if(x!=0)
{
printf("\n");
}
}
return 0;
}
void f1(int x,int y)
{
int k1,k2,i;
k1=x;
k2=y;
int l2;
l2=strlen(s2);
for(i=0;i<=l2-1&&x>=0;i++,x--)
{
if(s2[i]>='a'&&s2[i]<='z')
{
if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
{
;
}else
{
break;
}
}else if(s2[i]>='A'&&s2[i]<='Z')
{
if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
{
;
}else
{
break;
}
}
}
if(i==l2)
{
a[flag]=k1+1;
b[flag]=k2+1;
flag+=1;
}
x=k1;y=k2;
for(i=0;i<=l2-1&&x<=n-1;i++,x++)
{
if(s2[i]>='a'&&s2[i]<='z')
{
if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
{
;
}else
{
break;
}
}else if(s2[i]>='A'&&s2[i]<='Z')
{
if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
{
;
}else
{
break;
}
}
}
if(i==l2)
{
a[flag]=k1+1;
b[flag]=k2+1;
flag+=1;
}
x=k1;y=k2;
for(i=0;i<=l2-1&&y>=0;i++,y--)
{
if(s2[i]>='a'&&s2[i]<='z')
{
if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
{
;
}else
{
break;
}
}else if(s2[i]>='A'&&s2[i]<='Z')
{
if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
{
;
}else
{
break;
}
}
}
if(i==l2)
{
a[flag]=k1+1;
b[flag]=k2+1;
flag+=1;
}
x=k1;y=k2;
for(i=0;i<=l2-1&&y<=m-1;i++,y++)
{
if(s2[i]>='a'&&s2[i]<='z')
{
if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
{
;
}else
{
break;
}
}else if(s2[i]>='A'&&s2[i]<='Z')
{
if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
{
;
}else
{
break;
}
}
}
if(i==l2)
{
a[flag]=k1+1;
b[flag]=k2+1;
flag+=1;
}
x=k1;y=k2;
for(i=0;i<=l2-1&&y>=0&&x>=0;i++,y--,x--)
{
if(s2[i]>='a'&&s2[i]<='z')
{
if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
{
;
}else
{
break;
}
}else if(s2[i]>='A'&&s2[i]<='Z')
{
if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
{
;
}else
{
break;
}
}
}
if(i==l2)
{
a[flag]=k1+1;
b[flag]=k2+1;
flag+=1;
}
x=k1;y=k2;
for(i=0;i<=l2-1&&y<=m-1&&x>=0;i++,y++,x--)
{
if(s2[i]>='a'&&s2[i]<='z')
{
if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
{
;
}else
{
break;
}
}else if(s2[i]>='A'&&s2[i]<='Z')
{
if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
{
;
}else
{
break;
}
}
}
if(i==l2)
{
a[flag]=k1+1;
b[flag]=k2+1;
flag+=1;
}
x=k1;y=k2;
for(i=0;i<=l2-1&&y>=0&&x<=n-1;i++,y--,x++)
{
if(s2[i]>='a'&&s2[i]<='z')
{
if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
{
;
}else
{
break;
}
}else if(s2[i]>='A'&&s2[i]<='Z')
{
if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
{
;
}else
{
break;
}
}
}
if(i==l2)
{
a[flag]=k1+1;
b[flag]=k2+1;
flag+=1;
}
x=k1;y=k2;
for(i=0;i<=l2-1&&y<=m-1&&x<=n-1;i++,y++,x++)
{
if(s2[i]>='a'&&s2[i]<='z')
{
if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
{
;
}else
{
break;
}
}else if(s2[i]>='A'&&s2[i]<='Z')
{
if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
{
;
}else
{
break;
}
}
}
if(i==l2)
{
a[flag]=k1+1;
b[flag]=k2+1;
flag+=1;
}
}