Q10010: Where's Waldorf?
給你一個m*n的字元方塊(1 <= m,n <=50),以及一些字串,請你找出這些字串在字元方塊中出現的位置。請參考Sample Output。
我們在字元方塊中尋找字串的方向可以有8個:往左、往右、往上、往下、往左上、往左下、往右上、往右下。另外,請忽略字元大小寫,即 A 和 a 應被視為相同的字元。
Input
輸入的第一列有一個整數代表以下有幾組測試資料。
每組測試資料的第1列,有2個整數m,n(1 <= m,n <=50),代表接下來的文字方塊有m列,每列有n個字元。在文字方塊之後的一列有一個整數 k,代表接下來的k列為欲搜尋的字串。請參考Sample Input。
Output
每組測試資料中欲搜尋字串,請輸出其出現在文字方塊中的位置X Y。(第X列,第Y行)
如果在文字方塊中該字串出現在不只一個地方,請輸出在最左上方的那一組(以欲搜尋字串的第一個字元來比較)。所有欲搜尋的字串至少出現一次。
測試資料間也請空一列。
Sample input
2 8 11 abcDEFGhigg hEbkWalDork FtyAwaldORm FtsimrLqsrc byoArBeDeyv Klcbqwikomk strEBGadhrb yUiqlxcnBjf 4 Waldorf Bambi Betty Dagbert 2 2 ab Ca 3 a ba a
Sample Output
2 5 2 3 1 2 7 8 1 1 1 2 1 1
在网上找到的一份代码,写得挺不错的,看了代码之后学习了
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctype.h>
#define MAXN 60
int cas, m, n, q;
int x, y;
char r[MAXN][MAXN];
const int dx[] = { 1, 1, 1, -1, -1, -1, 0, 0};
const int dy[] = { 0, 1, -1, 0, 1, -1, 1, -1};
void search( const char *a, int &x, int &y)
{
int pos, nx, ny;
for( int i = 1; i <= m; i ++)
{
for( int j = 1; j <= n; j ++)
{
if( r[i][j] == a[0])
{
for( int k = 0; k < 8; k ++)
{
pos = 0; nx = i; ny = j;
while( a[pos] && a[pos] == r[nx][ny])
{
nx += dx[k];
ny += dy[k];
pos ++;
}
if( a[pos] == 0)
{
x = i;
y = j;
return;
}
}
}
}
}
}
int main()
{
scanf( "%d", &cas);
for( int tt = 1; tt <= cas; tt ++)
{
char word[MAXN];
if( tt >= 2) printf( "\n");
memset( r, 0, sizeof r);
scanf( "%d%d", &m, &n);
for( int i = 1; i <= m; i ++)
{
scanf( "%s", word);
for( int j = 1; j <= n; j ++)
{
r[i][j] = tolower(word[j - 1]);
}
}
scanf( "%d", &q);
while( q --)
{
scanf( "%s", word);
int len = strlen( word);
for( int i = 0; i < len; i ++)
{
word[i] = tolower( word[i]);
}
search( word, x, y);
printf( "%d %d\n", x, y);
}
}
return 0;
}