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;
}

posted @ 2012-05-25 08:19  Demon、  阅读(822)  评论(0)    收藏  举报