您的位置:首页 > 其它

uva10010 - Where's Waldorf?

2012-06-05 11:34 337 查看
题意 在一个二维的字符数组中!找到给你单词的开头字母的位置!搜索方向是八个方向!注意只能是沿直线搜索不能跳跃!

连接:点击打开链接

算法!模拟+单向DFS

#include <stdio.h>
#include <string.h>

char map[100][100];

void initilalize ( const int n, const int m )
{
for ( int i = 1; i <= n; i++ )
for ( int j = 1; j <= m; j++ )
if ( 'A' <= map[i][j] && map[i][j] <= 'Z' )
map[i][j] += 'a' - 'A';
}

void find ( char str[], const int n, const int m )
{
int len = strlen ( str ), i;
for ( i = 0; i < len; i++ )
if ( 'A' <= str[i] && str[i] <= 'Z' )
str[i] += 'a' - 'A';
for ( i = 1; i <= n; i++ )
for ( int j = 1; j <= m; j++ )
{
if ( map[i][j] != str[0] )
continue;
int x = i, y = j, flag[8] = {0}, k = 1;
while ( map[x+1][y+1] == str[k] && k < len )
{
flag[0]++;
k++;
x++;
y++;
}
x = i;
y = j;
k = 1;
while ( map[x][y+1] == str[k] && k < len )
{
flag[1]++;
k++;
y++;
}
x = i;
y = j;
k = 1;
while ( map[x-1][y+1] == str[k] && k < len )
{
flag[2]++;
x--;
k++;
y++;
}
x = i;
y = j;
k = 1;
while ( map[x-1][y] == str[k] && k < len )
{
flag[3]++;
k++;
x--;
}
x = i;
y = j;
k = 1;
while ( map[x-1][y-1] == str[k] && k < len )
{
flag[4]++;
k++;
x--;
y--;
}
x = i;
y = j;
k = 1;
while ( map[x][y-1] == str[k] && k < len )
{
flag[5]++;
k++;
y--;
}
x = i;
y = j;
k = 1;
while ( map[x+1][y-1] == str[k] && k < len )
{
flag[1]++;
k++;
y--;
x++;
}
x = i;
y = j;
k = 1;
while ( map[x+1][y] == str[k] && k < len )
{
flag[1]++;
k++;
x++;
}
for ( k = 0; k < 8; k++ )
if ( flag[k] == len - 1 )
{
printf ( "%d %d\n", i, j );
return ;
}
}
}

int main ( )
{
int t;
scanf ( "%d", &t );
while ( t-- )
{
int n, m;
scanf ( "%d%d", &n, &m );
memset ( map, '*', sizeof map );
for ( int i = 1; i <= n; i++ )
scanf ( "%s", map[i]+1 );
initilalize ( n, m );
int cont;
scanf ( "%d", &cont );
while ( cont -- )
{
char str[100];
scanf ( "%s", str );
find ( str, n, m );
}
if ( t )
puts ( "" );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: