UVa 10010 沃尔多夫在那里

/*

解题思路:

此题略坑、有好多陷阱。

第一个是、一旦确定搜索方向,该条路径方向不可改变(所以不可以用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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值