Programming Challenges 习题 3.8.2

PC/UVa:110302/10010

Where’s Waldorf?

书上有一个提示,说是否一定要写8个方向的循环,还是可以写一个函数来判断8个方向。既然提示了,那就按照书上的提示来写了。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

bool find(const vector<vector<char>> &vvcRec, const string &strWord, int x, int y, int dirx, int diry)
{
	size_t k, i, j;
	for (k = 0, i = x, j = y;
		k < strWord.size() && i >= 0 && i < vvcRec.size() && j >= 0 && j < vvcRec[0].size();
		k++, i += dirx, j += diry)
	{
		if (vvcRec[i][j] != strWord[k]) break;
	}
	if (k != strWord.size()) return false;
	else{
		cout << x + 1 << ' ' << y + 1 << endl;
		return true;
	}
}

int main()
{
	int T = 0;
	cin >> T;
	cin.get();
	cin.get();
	for (int t = 0; t < T; t++)
	{
		int m = 0, n = 0, k = 0;
		cin >> m >> n;
		vector<vector<char>> vvcRec(m, vector<char>(n, '\0'));
		for (int i = 0; i < m; i++)
		{
			for (int j = 0; j < n; j++)
			{
				cin >> vvcRec[i][j];
				vvcRec[i][j] = tolower(vvcRec[i][j]);
			}
		}
		cin >> k;
		cin.get();
		vector<string> vstrWord;
		string strWord;
		while (getline(cin, strWord)){
			if (strWord.empty()) break;
			for (char& ch : strWord)
			{
				ch = tolower(ch);
			}
			vstrWord.push_back(strWord);
		}
		for (auto word : vstrWord)
		{
			bool bFind = false;
			for (int i = 0; i < m; i++)
			{
				for (int j = 0; j < n; j++)
				{
					if (vvcRec[i][j] == word[0] &&
						(
						find(vvcRec, word, i, j, -1, 0) ||
						find(vvcRec, word, i, j, -1, 1) ||
						find(vvcRec, word, i, j, 0, 1) ||
						find(vvcRec, word, i, j, 1, 1) ||
						find(vvcRec, word, i, j, 1, 0) ||
						find(vvcRec, word, i, j, 1, -1) ||
						find(vvcRec, word, i, j, 0, -1) ||
						find(vvcRec, word, i, j, -1, -1)
						)
						){
						bFind = true;
						break;
					}
				}
				if (bFind) break;
			}
		}
		if (t != T - 1) cout << endl;
	}
	return 0;
}
/*
1

8 11
abcDEFGhigg
hEbkWalDork
FtyAwaldORm
FtsimrLqsrc
byoArBeDeyv
Klcbqwikomk
strEBGadhrb
yUiqlxcnBjf
4
Waldorf
Bambi
Betty
Dagbert
*/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值