题意很明确,给一个字符网格,求匹配的字母的开头字母行列数。
八个方向都可以匹配,直接模拟就行了。
看到网上有用方向数组来处理的,但是没有直接酱紫做简单暴力。
开始的时候一直wa,然后一直看代码,看到想吐了也没发现错误,最后回去看题目:
For each test case, the output must follow the description below. The outputs of two consecutive cases will be separated by a blank line.
。。。还能说什么呢
代码:
#include <stdio.h>
const int Maxn = 51;
char word[Maxn][Maxn];
char key[Maxn];
int m, n;
bool up(int x, int y)
{
for (int i = 0; key[i] != '\n' && key[i] != '\0'; i++)
{
if (x < 1 || word[x][y] != key[i])
return false;
x--;
}
return true;
}
bool down(int x, int y)
{
for (int i = 0; key[i] != '\n' && key[i] != '\0'; i++)
{
if (x > m || word[x][y] != key[i])
return false;
x++;
}
return true;
}
bool left(int x, int y)
{
for (int i = 0; key[i] != '\n' && key[i] != '\0'; i++)
{
if (y < 1 || word[x][y] != key[i])
return false;
y--;
}
return true;
}
bool right(int x, int y)
{
for (int i = 0; key[i] != '\n' && key[i] != '\0'; i++)
{
if (y > n || word[x][y] != key[i])
return false;
y++;
}
return true;
}
bool leup(int x, int y)
{
for (int i = 0; key[i] != '\n' && key[i] != '\0'; i++)
{
if (y < 1 || x < 1 || word[x][y] != key[i])
return false;
y--;
x--;
}
return true;
}
bool riup(int x, int y)
{
for (int i = 0; key[i] != '\n' && key[i] != '\0'; i++)
{
if (y > n || x < 1 || word[x][y] != key[i])
return false;
y++;
x--;
}
return true;
}
bool ledo(int x, int y)
{
for (int i = 0; key[i] != '\n' && key[i] != '\0'; i++)
{
if (y < 1 || x > m || word[x][y] != key[i])
return false;
y--;
x++;
}
return true;
}
bool rido(int x, int y)
{
for (int i = 0; key[i] != '\n' && key[i] != '\0'; i++)
{
if (x > m || y > n || word[x][y] != key[i])
return false;
y++;
x++;
}
return true;
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int ncase;
scanf("%d", &ncase);
while (ncase--)
{
int k;
int i, j;
scanf("%d%d", &m, &n);
getchar();
for (i = 1; i <= m; i++)
{
for (j = 1; j <= n; j++)
{
scanf("%c", &word[i][j]);
if (word[i][j] >= 'A' && word[i][j] <= 'Z')
{
word[i][j] += 32;
}
}
getchar();
}
scanf("%d", &k);
getchar();
while (k--)
{
scanf("%s", key);
getchar();
for (i = 0; key[i]; i++)
{
if (key[i] >= 'A' && key[i] <= 'Z')
{
key[i] += 32;
}
}
bool end = false;
for (i = 1; i <= m; i++)
{
for (j = 1; j <= n; j++)
{
if (left(i, j))
{
end = true;
break;
}
if (right(i, j))
{
end = true;
break;
}
if (up(i, j))
{
end = true;
break;
}
if (down(i, j))
{
end = true;
break;
}
if (leup(i, j))
{
end = true;
break;
}
if (riup(i, j))
{
end = true;
break;
}
if (ledo(i, j))
{
end = true;
break;
}
if (rido(i, j))
{
end = true;
break;
}
}
if (end)
{
printf("%d %d\n", i, j);
break;
}
}
}
//debug
if(ncase)
printf("\n");
}
return 0;
}