这道题就是8个方向都找找吧.
感觉写起来还比较顺,不过逻辑错误处处都是.
最开始写出来的代码,输出来的数都要少1,因为没考虑到c的数组下标都是从0开始的,所以输出的时候,都加上1就行了.
一开始还没写break语句,导致用测试数据的时候,输出还多了一组= =||
看着都要AC了,可还是不对,找了份别人源码,更多的数据一对比,才发现自己多输出有空行.
这道题以及上一道都存在输出格式问题,都耽误了很多时间.
看来以后读题要多注意. 这两道题也写得很凌乱,看来先写写伪代码还是有必要的.
#include<stdio.h>
#include<ctype.h>
#include<string.h>
const int maxn = 100;
int main()
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif
int t;
int m, n;
int t_k;
int ok = 0;//判断某个单词是否已找到字母
char s[maxn][50];
char word[20][50];
scanf("%d", &t);
while(t-- > 0)
{
scanf("%d%d", &m, &n);
for(int i = 0; i < m; i++) scanf("%s", s[i]);
scanf("%d", &t_k);
for(int i = 0; i < t_k; i++) scanf("%s", word[i]);
//8个方向寻找
for(int i = 0; i < t_k; i++)
{
//找到符合第一个字母的字母,并判断
ok = 0;
for(int j = 0; j < m && !ok; j++)
for(int k = 0; k < n && !ok; k++)
if(toupper(s[j][k]) == toupper(word[i][0]))
{
int p, q;
int len_check, len = strlen(word[i]);
//判断顺序:斜上偏左,斜下偏右,斜下偏左,斜上偏右,上,下,左,右
for(p = j-1, q = k-1, len_check = 1; p >= 0 && q >= 0; --p, --q)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}
//从下一个方向,如果len_check == len,就结束循环,避免重复输出
for(p = j+1, q = k+1, len_check = 1; p <= m && q <= n && !ok; ++p, ++q)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}
for(p = j+1, q = k-1, len_check = 1; p <= m && q >= 0 && !ok; ++p, --q)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}
for(p = j-1, q = k+1, len_check = 1; p >= 0 && q <= n && !ok; --p, ++q)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}
for(p = j-1, q = k, len_check = 1; p >= 0 && !ok; --p)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}
for(p = j+1, q = k, len_check = 1; p <= m && !ok; ++p)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}
for(p = j, q = k-1, len_check = 1; q >= 0 && !ok; --q)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}
for(p = j, q = k+1, len_check = 1; q <= n && !ok; ++q)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}
}
}
if(t > 0) printf("\n");//每处理完一组空行
}
return 0;
}