UVA - 10010 - Where's Waldorf

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=96&page=show_problem&problem=951


题意:

  在给定字符表里,横竖撇捺八个方向找对应的字符串。


解题:

  八个方向直接搜。好长的代码。


  下午卡了N久,UVA都崩溃了。一上来就AC了。


#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

const int MAXN = 50;

int m, n;
char sz[MAXN+1][MAXN+1];
void strToLower(char str[])
{
	for ( int i=0; i<strlen(str); i++ )
	{
		str[i] = tolower(str[i]);
	} // end for
}


void szToLower()
{
	for ( int i=0; i<m; i++ )
	{
		strToLower(sz[i]);
	} // end for
}


bool fsearch(char str[], int r, int c)
{
	bool bRes;
	// →
	bRes = true;
	if ( c+strlen(str)-1 >= n )
	{
		bRes = false;
	} // end if
	else
	{
		for ( int k=0; k<strlen(str); k++ )
		{
			if ( !(c+k<n) || (sz[r][c+k] != str[k]) )
			{
				bRes = false;
				break;
			} // end if
		} // end for
	} // end else
	if ( bRes )	return bRes;

	// ←
	bRes = true;
	if ( c-strlen(str)+1 < 0 )
	{
		bRes = false;
	} // end if
	else
	{
		for ( int k=0; k<strlen(str); k++ )
		{
			if ( !(c-k>=0) || (sz[r][c-k] != str[k]) )
			{
				bRes = false;
				break;
			} // end if
		} // end for
	} // end else
	if ( bRes )	return bRes;

	// ↓
	bRes = true;
	if ( r+strlen(str)-1 >=m )
	{
		bRes = false;
	} // end if
	else
	{
		for ( int k=0; k<strlen(str); k++ )
		{
			if ( !(r+k<m) || (sz[r+k][c] != str[k]) )
			{
				bRes = false;
				break;
			} // end if
		} // end for
	} // end else
	if ( bRes )	return bRes;

	// ↑
	bRes = true;
	if ( r-strlen(str)+1 < 0 )
	{
		bRes = false;
	} // end if
	else
	{
		for ( int k=0; k<strlen(str); k++ )
		{
			if ( !(r-k>=0) || (sz[r-k][c] != str[k]) )
			{
				bRes = false;
				break;
			} // end if
		} // end for
	} // end else
	if ( bRes )	return bRes;

	// ↘
	bRes = true;
	if ( c+strlen(str)-1 >=n || r+strlen(str)-1 >=m )
	{
		bRes = false;
	} // end if
	else
	{
		for ( int k=0; k<strlen(str); k++ )
		{
			if ( !(r+k<m) || !(c+k<n) || (sz[r+k][c+k] != str[k]) )
			{
				bRes = false;
				break;
			} // end if
		} // end for
	} // end else
	if ( bRes )	return bRes;

	// ↖
	bRes = true;
	if ( c-strlen(str)+1 < 0 || r-strlen(str)+1 < 0 )
	{
		bRes = false;
	} // end if
	else
	{
		for ( int k=0; k<strlen(str); k++ )
		{
			if ( !(r-k>=0) || !(c-k>=0) || (sz[r-k][c-k] != str[k]) )
			{
				bRes = false;
				break;
			} // end if
		} // end for
	} // end else
	if ( bRes )	return bRes;

	// ↗
	bRes = true;
	if ( c+strlen(str)-1 >=n || r-strlen(str)+1 < 0 )
	{
		bRes = false;
	} // end if
	else
	{
		for ( int k=0; k<strlen(str); k++ )
		{
			if ( !(r-k>=0) || !(c+k<n) || (sz[r-k][c+k] != str[k]) )
			{
				bRes = false;
				break;
			} // end if
		} // end for
	} // end else
	if ( bRes )	return bRes;

	// ↙
	bRes = true;
	if ( c-strlen(str)+1 < 0 || r+strlen(str)-1 >=m )
	{
		bRes = false;
	} // end if
	else
	{
		for ( int k=0; k<strlen(str); k++ )
		{
			if ( !(r+k<m) || !(c-k>=0) || (sz[r+k][c-k] != str[k]) )
			{
				bRes = false;
				break;
			} // end if
		} // end for
	} // end else
	if ( bRes )	return bRes;

	return false;
}


int main()
{
	int nCase;
	
	cin >>nCase;
	while ( nCase-- )
	{
		cin >>m >>n;
		cin.ignore();

		for ( int i=0; i<m; i++ )
			cin.getline(sz[i], MAXN);

		szToLower();

		int nStr;
		cin >>nStr;
		while ( nStr-- )
		{
			char str[MAXN+1];
			cin >>str;
			strToLower(str);
			bool bFind = false;
			int i, j;
			for ( i=0; i<m; i++ )
			{
				for ( j=0; j<n; j++ )
				{
					bFind = fsearch(str, i, j);
					if ( bFind )	break;
				} // end for
				if ( bFind )	break;
			} // end for
			cout <<i+1 <<' ' <<j+1 <<'\n';
		} // end while

		if ( nCase != 0 )
		{
			cout <<'\n';
		} // end if
		
	} // end while
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值