您的位置:首页 > 其它

UVa 10010 沃尔多夫在那里

2014-01-25 00:09 288 查看
/*

    解题思路:

此题略坑、有好多陷阱。

第一个是、一旦确定搜索方向,该条路径方向不可改变(所以不可以用BFS或者DFS遍历搜索)

第二个是、多组案例除最后一组外每组案例结尾有一个空行(这里错了超久、一直忽略)

    题意:

找出最上最左边的输入单词首字母的横纵坐标位置、该位置可以有一条路径把输入的字符串全部找到

*/

#include <stdio.h>
#include <string.h>
#define A 60
#define B 10
int m,n;
int flag,len;
char map[ A ][ A ];
char match[ A ];
int dx[ B ] = { 1 , -1 , 0 , 0 , 1 , 1 , -1 , -1 };
int dy[ B ] = { 0 , 0 , 1 , -1 , 1 , -1 , 1 , -1 };
int queueX[ A ];
int queueY[ A ];
int p,q;
void search( int xx , int yy ,int k)
{
char c1 = match[ q ] , c2;

if( c1<='Z' && c1>='A' )
c2 = (char)(c1-'A'+'a');
else
c2 = (char)(c1-'a'+'A');

if( q == len )
{
flag = 1;
return ;
}
if( xx+dx[k] < m && yy+dy[k] < n && xx+dx[k] >=0 && yy+dy[k] >=0 && ( map[ xx+dx[k] ][  yy+dy[k] ] == c1 || map[ xx+dx[k] ][ yy+dy[k] ] == c2 ) )
{
q++;
queueX[ p++ ] = xx+dx[k];
queueY[ p++ ] = yy +dy[k];
search( xx+dx[k] , yy+dy[k] , k );
if( flag ) return;
q--;
p--;
}
}
int main( )
{
int t;
int i,j,k,l,o;
char c1,c2;

scanf("%d",&t);
while( t-- )
{
scanf("%d%d",&m,&n);
for( i=0;i<m;i++ )
scanf("%s",&map[ i ] );

scanf("%d",&k);
for( i=0;i<k;i++ )
{
flag = p = q = 0;

scanf("%s",match );
len = strlen( match );

for( j=0;j<m;j++ )
{
for( l=0;l<n;l++ )
{
c1 = match[ q ];
if( c1<='Z' && c1>='A' )
c2 = (char)(c1-'A'+'a');
else
c2 = (char)(c1-'a'+'A');

if( map[ j ][ l ] == c1 || map[ j ][ l ] == c2 )
{
queueX[ 0 ] = j;
queueY[ 0 ] = l;
q++;
for(o=0;o<8;o++ )
search( j ,  l , o );
if( flag ) break;
q--;
}
}
if( flag ) break;
}
printf("%d %d\n",j+1,l+1);
}
if( t!=0 )
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: