UVa 10010 - Where's Waldorf?

     其实这道题目,只要是明白了意思,实现起来很简单,不需要什么高深的算法,但却很容易出错,尤其在处理从八个方向比对字符串的时候,要注意各个量的变化,变了的要进行还原,最后去最值的时候,有两个过程,一是选行最小的那个,二是如果两个开头的字母所在的行相同的时候,要在进行比较列的大小,选列小的那个。

    在使用的全局变量的时候,在定义局部变量的时候,不要重复定义,否则编译时虽然不会出错,在运行出结果的时候,却出错,错误点很难查到。所以在编写的时候,就要注意。

下面是我的代码 ,有点长,请各位指教:

#include <stdio.h>
#include <string.h>
char s1[100][100],s2[100];
int a[100000],b[100000],flag;
int n,m;
int main()
{
	void f1(int x,int y);
	int i,j,x,k1,k2,min,key1,key2,z;
	scanf("%d",&x);
	while(x--)
	{
		scanf("%d %d",&n,&m);
		for(i=0;i<=n-1;i++)
		{
			scanf("%s",s1[i]);
		}
		scanf("%d",&z);
		while(z--)
		{
			min=1000000;
			scanf("%s",s2);
			flag=0;
			k1=0;
			k2=-1;
				for(i=k1;i<=n-1;)
				{
					for(j=k2+1;j<=m-1;)
					{
						if(s1[i][j]>='a'&&s1[i][j]<='z')
						{
							if(s1[i][j]==s2[0]||s1[i][j]-32==s2[0])
							{
								k1=i;
								k2=j;
								break;
							}else
							{
								j+=1;
							}
						}else if(s1[i][j]>='A'&&s1[i][j]<='Z')
						{
							if(s1[i][j]==s2[0]||s1[i][j]+32==s2[0])
							{
								k1=i;
								k2=j;
								break;
							}else
							{
								j+=1;
							}
						}
					}
					if(j==m)
					{
						k2=-1;
						i+=1;
					}else
					{
						f1(k1,k2);
						i=k1;
					}
				}
				for(i=0;i<=flag-1;i++)
				{
					if(a[i]<min)
					{
						min=a[i];
						key1=b[i];
						key2=i;
					}else if(a[i]==min)
					{
						min=a[i];
						if(b[i]<key1)
						{
							key1=b[i];
							key2=i;
						}
					}
				}
				printf("%d %d\n",a[key2],key1);
		}
		if(x!=0)
		{
			printf("\n");
		}
	}
	return 0;
}
 
void f1(int x,int y)
{
	int k1,k2,i;
	k1=x;
	k2=y;
	int l2;
	l2=strlen(s2);
	for(i=0;i<=l2-1&&x>=0;i++,x--)
	{
		if(s2[i]>='a'&&s2[i]<='z')
		{
			if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}else if(s2[i]>='A'&&s2[i]<='Z')
		{
			if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}
	}
	if(i==l2)
	{
		a[flag]=k1+1;
		b[flag]=k2+1;
		flag+=1;
	}
	x=k1;y=k2;
   for(i=0;i<=l2-1&&x<=n-1;i++,x++)
	{
		if(s2[i]>='a'&&s2[i]<='z')
		{
			if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}else if(s2[i]>='A'&&s2[i]<='Z')
		{
			if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}
	}
	if(i==l2)
	{
		a[flag]=k1+1;
		b[flag]=k2+1;
		flag+=1;
	}
	x=k1;y=k2;
   for(i=0;i<=l2-1&&y>=0;i++,y--)
	{
		if(s2[i]>='a'&&s2[i]<='z')
		{
			if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}else if(s2[i]>='A'&&s2[i]<='Z')
		{
			if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}
	}
	if(i==l2)
	{
		a[flag]=k1+1;
		b[flag]=k2+1;
		flag+=1;
	}
	x=k1;y=k2;
	for(i=0;i<=l2-1&&y<=m-1;i++,y++)
	{
		if(s2[i]>='a'&&s2[i]<='z')
		{
			if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}else if(s2[i]>='A'&&s2[i]<='Z')
		{
			if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}
	}
	if(i==l2)
	{
		a[flag]=k1+1;
		b[flag]=k2+1;
		flag+=1;
	}
	x=k1;y=k2;
for(i=0;i<=l2-1&&y>=0&&x>=0;i++,y--,x--)
	{
		if(s2[i]>='a'&&s2[i]<='z')
		{
			if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}else if(s2[i]>='A'&&s2[i]<='Z')
		{
			if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}
	}
	if(i==l2)
	{
		a[flag]=k1+1;
		b[flag]=k2+1;
		flag+=1;
	}
	x=k1;y=k2;
	for(i=0;i<=l2-1&&y<=m-1&&x>=0;i++,y++,x--)
	{
		if(s2[i]>='a'&&s2[i]<='z')
		{
			if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}else if(s2[i]>='A'&&s2[i]<='Z')
		{
			if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}
	}
	if(i==l2)
	{
		a[flag]=k1+1;
		b[flag]=k2+1;
		flag+=1;
	}
	x=k1;y=k2;
for(i=0;i<=l2-1&&y>=0&&x<=n-1;i++,y--,x++)
	{
		if(s2[i]>='a'&&s2[i]<='z')
		{
			if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}else if(s2[i]>='A'&&s2[i]<='Z')
		{
			if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}
	}
	if(i==l2)
	{
		a[flag]=k1+1;
		b[flag]=k2+1;
		flag+=1;
	}
	x=k1;y=k2;
    for(i=0;i<=l2-1&&y<=m-1&&x<=n-1;i++,y++,x++)
	{
		if(s2[i]>='a'&&s2[i]<='z')
		{
			if(s2[i]==s1[x][y]||s2[i]-32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}else if(s2[i]>='A'&&s2[i]<='Z')
		{
			if(s2[i]==s1[x][y]||s2[i]+32==s1[x][y])
			{
				;
			}else
			{
				break;
			}
		}
	}
	if(i==l2)
	{
		a[flag]=k1+1;
		b[flag]=k2+1;
		flag+=1;
	}
}


 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值