字符串的题可真是简直了。。。。【真是复杂。。主要是判断的情况多而且边界的判断可真是麻烦啊。。。或许或许有简单的方法吧。。】
给一个m*n的字元方块,可以从一个元素向上,向下,向左,向右,向左上,向右下,向左下,向右上八个方向进行搜索,输入给出的单词全部都可以通过该规则进行查找到,给出首字母的位置,题目重点应该在那个toupper上。。。。。题目说部分大小写,那就都变成大写的或者小写的叭
#include <cstdio>
#include <iostream>
#include <cctype>
using namespace std;
int n,m;
const int maxn=55;
char letter[maxn][maxn],word[maxn];
void f(int m,int n,int len)
{
int i,j,k,a,b;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(letter[i][j]==word[0])
{
a=i;b=j;k=0;
while(a>0&&letter[a-1][b]==word[k+1])//向上搜索
{
k++;
a--;
}
if(k==len-1)//如果搜索到单词就结束
{
printf("%d %d\n",i+1,j+1);
return;
}
a=i;b=j;k=0;
while(a<m-1&&letter[a+1][b]==word[k+1])//向下搜索
{
k++;
a++;
}
if(k==len-1)//如果搜索到单词就结束
{
printf("%d %d\n",i+1,j+1);
return;
}
a=i;b=j;k=0;
while(b>0&&letter[a][b-1]==word[k+1])//向左搜索
{
k++;
b--;
}
if(k==len-1)//如果搜索到单词就结束
{
printf("%d %d\n",i+1,j+1);
return;
}
a=i;b=j;k=0;
while(b<n-1&&letter[a][b+1]==word[k+1])//向右搜索
{
k++;
b++;
}
if(k==len-1)//如果搜索到单词就结束
{
printf("%d %d\n",i+1,j+1);
return;
}
a=i;b=j;k=0;
while(a>0&&b>0&&letter[a-1][b-1]==word[k+1])//向左上搜索
{
k++;
a--;
b--;
}
if(k==len-1)//如果搜索到单词就结束
{
printf("%d %d\n",i+1,j+1);
return;
}
a=i;b=j;k=0;
while(a>0&&b<n-1&&letter[a-1][b+1]==word[k+1])//向右上搜索
{
k++;
a--;
b++;
}
if(k==len-1)//如果搜索到单词就结束
{
printf("%d %d\n",i+1,j+1);
return;
}
a=i;b=j;k=0;
while(a<m-1&&b>0&&letter[a+1][b-1]==word[k+1])//向左下搜索
{
k++;
a++;
b--;
}
if(k==len-1)//如果搜索到单词就结束
{
printf("%d %d\n",i+1,j+1);
return;
}
a=i;b=j;k=0;
while(a<m-1&&b<n-1&&letter[a+1][b+1]==word[k+1])
{
k++;
a++;
b++;
}
if(k==len-1)//如果搜索到单词就结束
{
printf("%d %d\n",i+1,j+1);
return;
}
}
}
}
int main()
{
int t,m,n,k,i,j;
cin>>t;
while(t--)
{
cin>>m>>n;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cin>>letter[i][j];
letter[i][j]=toupper(letter[i][j]);
}
}
cin>>k;
for(i=0;i<k;i++)
{
cin>>word;
for(j=0;word[j]!='\0';j++)
word[j]=toupper(word[j]);
f(m,n,j);
}
if(t!=0)
cout<<endl;
}
}
可真是对字符串的题无爱了。。。。。