uvaoj10010_where's waldorf

这个题的理论思路很简单,模拟人的思维模式。先将所有的字母转换为小写,然后寻找第一个匹配的字符,再从八个方向寻找第二个匹配的字符,同时也确定了一个方向向量,接着按照这个方向向量继续匹配下去,如果可以完全匹配则输出第一个字母的坐标即可。

以下是代码实现:

#include <stdio.h>

#include <ctype.h>

#include <string.h>

typedef struct direc

{

int x,y;

}direc;

void tolowerletter(char c[50][50],int a,int b)

{

int i,j;

for(i=0;i<a;i++)

{

for(j=0;j<b;j++)

{

if(c[i][j]<91)c[i][j]+=32;

}

}

return;

}

 

 

void strtolower(char c[80],int len)

{

int i;

for(i=0;i<len;i++)

{

if(c[i]<91)c[i]+=32;

}

return;

 

 

}

int main()

{

freopen("datain.txt","r",stdin);

direc Direc[8];

int T,i,j,m,n,t=0,dir,k,c,x,y,p,q,flag;

for(i=-1;i<2;i++)

for(j=-1;j<2;j++)

{

if(i==0 && j==0) continue;

Direc[t].x=i;Direc[t].y=j;

t++;

}

char words[80];

char table[50][50];

scanf("%d",&T);

while(T--)

{

scanf("%d%d",&m,&n);

getchar();

memset(table,0,sizeof(table));

for(i=0;i<m;i++)

{

for (j = 0; j < n; j++)

{

scanf("%c",&table[i][j]);

}

getchar();

}

tolowerletter(table,m,n);

scanf("%d",&t);getchar();

while(t--)

{

flag=0;

memset(words,0,sizeof(words));

scanf("%s",words);

strtolower(words,strlen(words));

k=0;

for(i=0;i<m;i++)

{

for (j=0;j<n;j++)

{

if(table[i][j]==words[k])

{

k++;

for(c=0;c<8;c++)

{

if(i+Direc[c].x < 0||i+Direc[c].x >=m||j+Direc[c].y<0||j+Direc[c].y>= n)

continue;

 

 

if(words[k]==table[i+Direc[c].x][j+Direc[c].y])

{

dir=c;x=i;y=j;p=i+Direc[dir].x;q=j+Direc[dir].y;

while(k<strlen(words))

{

 

 

if(words[k]==table[p][q])

{k++;p+=Direc[dir].x;q+=Direc[dir].y;}

else break;

}

if(k==strlen(words))

{printf("%d %d\n",x+1,y+1 );flag=1;break;}

}

else

continue;

 

 

}

}

if(flag==1)break;

}

if(flag==1)break;

}

 

 

}

printf("\n");

 

 

}

return 0;

}

这个是版本1.0 WA

奇怪的是在调试中明明可以输出每个测试用例的结果,但是如果直接调试,则仅输出第三个测试用例的结果。(用的是官方提供的数据)

参考这位的AC代码:http://blog.csdn.net/free_shy/article/details/8585160

还有这位的:http://blog.csdn.net/u013746460/article/details/22811557

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值