UVA 10010 Where's Waldorf? 求指导、
思路很简单,先是输入并统一大小写,然后在表中找到字串的第一个字符,并以此展开(FC()函数),确定了第二个元素方向后,调用CF()函数按方向一直查找下去。
若完全匹配,则输出第一元素的位置。
但是一直是WA,自己设的几组数据也不能通过。
以下是代码:
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int FC(int i,int j);
int CF(int t,int x,int y);
char a[50][50];
int n,m;
string s;
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++) //输入
cin>>a[i][j];
for(int i=0;i<n;i++) //构造字典表
for(int j=0;j<m;j++)
if(isupper(a[i][j]))
a[i][j]+=32; //统一大小写
int z;
cin>>z;
while(z--)
{
cin>>s;int f;
for(int i=0;i<s.size();i++)
if(isupper(s[i]))
s[i]+=32; //统一大小写
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
if(a[i][j]==s[0])
{
f=FC(i,j);
if(f)
{ cout<<i+1<<' '<<j+1<<endl;break;}
}
if(f)
break;
}
}
return 0;
}
int FC(int i,int j)
{
int x,y;
x=i-1;
y=j-1;
for(x;x<=i+1;x++)
for(y;y<=j+1;y++)
{
if((x==i)&&(y==j))continue;
if(a[x][y]==s[1])//确定方向 下一步调用方向向前函数
{
int t=(x-i+2)+(y-j+2)*10;
int d=CF(t,x,y);
if(d)
{
return 1;
}
}
}
return 0;
}
int CF(int t,int x,int y)//沿方向逐一判断
{
for(int i=2;i<s.size();i++)
{
switch(t)
{
case 11:x--;y--;if(x<0||y<0)return 0;if(a[x][y]==s[i])continue;else return 0;
case 12:y--;if(y<0)return 0;if(a[x][y]==s[i])continue;else return 0;
case 13:x++;y--;if(x>n||y<0)return 0;if(a[x][y]==s[i])continue;else return 0;
case 21:x--;if(x<0)return 0;if(a[x][y]==s[i])continue;else return 0;
case 23:x++;if(x>n)if(a[x][y]==s[i])continue;else return 0;
case 31:x--;y++;if(x<0||y>m)if(a[x][y]==s[i])continue;else return 0;
case 32:y++;if(y>m)if(a[x][y]==s[i])continue;else return 0;
case 33:x++;y++;if(x>n||y>m)if(a[x][y]==s[i])continue;else return 0;
}
}
return 1;
}

浙公网安备 33010602011771号