uvaoj10010_where's waldorf
2015-12-03 20:03
274 查看
这个题的理论思路很简单,模拟人的思维模式。先将所有的字母转换为小写,然后寻找第一个匹配的字符,再从八个方向寻找第二个匹配的字符,同时也确定了一个方向向量,接着按照这个方向向量继续匹配下去,如果可以完全匹配则输出第一个字母的坐标即可。
以下是代码实现:
#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
以下是代码实现:
#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
相关文章推荐
- P53第二题
- DevExpress控件使用系列--ASPxTreeList
- php基础学习
- singleview---main.cpp
- HDU 1215 求N的因子之和
- ajax异步提交的两种方法
- LeetCode148 Sort List
- ActionBarActivity 3.0出现
- 重学C++Primer笔记11---类的四个合成和MyString类的实现
- Android:EditText光标颜色及粗细
- eclipse背景颜色修改
- 在Myeclipse下查看Java字节码指令信息
- php 遍历静态html成文章列表
- Android没有64位.so导致的崩溃
- js倒计时
- MeasureSpec介绍及使用详解
- HTML静态网页标签
- 20151203练习
- [转载]宏定义
- IOS程序之间的文件共享