uva-10010 - Where's Waldorf?

这道题目做了我很长时间,主要是太麻烦。

大体的做题思想就是从0.0搜到二维数组的最后,把每一个都按照八个方向挨着找。

还是很简单的,就是代码有点长,唯一让我欣慰的是1A了,很爽。

做题的时候用了点小技巧,把所有的字母全部转化成小写的,这样就可以直接判断了,不过令我郁闷的是strlwr函数在LINUX下竟然不能用,还得我自己创建函数,墨迹了一点,,



#include<stdio.h>
#include<string.h>
char str[100][100];
char str1[100];
int n1,m1;
int pan(int x,int y,char *s)
{
	n1++,m1++;
	int i,n;
	n=strlen(s);
	if(x+n<n1)
	{
	for(i=0;i<n;i++)
	{
		if(str[x+i][y]!=s[i])
		break;
	}
	if(i==n)
	return 1;
	}
	if(y+n<m1)
	{
	for(i=0;i<n;i++)
	{
		if(str[x][y+i]!=s[i])
		break;
	}
	if(i==n)
	return 1;
	}
	if(x+n<n1&&y+n<m1)
	{
		for(i=0;i<n;i++)
		{
			if(str[x+i][y+i]!=s[i])
			break;
		}
		if(i==n)
		return 1;
	}
	if(x-n>=0)
	{
	for(i=0;i<n;i++)
	{
		if(str[x-i][y]!=s[i])
		break;
	}
	if(i==n)
	return 1;
	}
	if(y-n>=0)
	{
		for(i=0;i<n;i++)
	{
		if(str[x][y-i]!=s[i])
		break;
	}
	if(i==n)
	return 1;
	}
	if(x-n>=0&&y-n>=0)
	{
	for(i=0;i<n;i++)
	{
		if(str[x-i][y-i]!=s[i])
		break;
	}
	if(i==n)
	return 1;
	}
	if(x+n<n1&&y-n>=0)
	{
	for(i=0;i<n;i++)
	{
		if(str[x+i][y-i]!=s[i])
		break;
	}
	if(i==n)
	return 1;
	}
	if(x-n>=0&&y+n<m1)
	{
	for(i=0;i<n;i++)
	{
		if(str[x-i][y+i]!=s[i])
		break;
	}
	if(i==n)
	return 1;
	}
	return 0;
}
void strl(char *s)
{
    int n,i;
    n=strlen(s);
    for(i=0;i<n;i++)
    {
        if(s[i]>='A'&&s[i]<='Z')
        s[i]=s[i]-'A'+'a';
    }
}
int main()
{
	int n,i,j,k,m,t,u;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%*c",&n,&m);
		n1=n,m1=m;
		for(i=0;i<n;i++)
		{
			gets(str[i]);
			strl(str[i]);
		}
		scanf("%d%*c",&k);
		for(u=0;u<k;u++)
		{
			gets(str1);
			strl(str1);
			for(i=0;i<n;i++)
			{
				for(j=0;j<m;j++)
				{
					if(str[i][j]==str1[0])
					{
						if(pan(i,j,str1))
						break;
					}
				}
				if(j!=m)break;
			}
			printf("%d %d\n",i+1,j+1);
		}
		if(t!=0)
		printf("\n");
	}
	return 0;
}


你可能感兴趣的:(uva-10010 - Where's Waldorf?)