P1101 单词方阵

 P1101 单词方阵

题目描述

给一n×n的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*代替,以突出显示单词。例如:

输入:
    8                     输出:
    qyizhong              *yizhong
    gydthkjy              gy******
    nwidghji              n*i*****
    orbzsfgz              o**z****
    hhgrhwth              h***h***
    zzzzzozo              z****o**
    iwdfrgng              i*****n*
    yyyygggg              y******g

输入格式

第一行输入一个数n。(7≤n≤100)。

第二行开始输入n×n的字母矩阵。

输出格式

突出显示单词的n×n矩阵。

输入输出样例

输入

7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa

输出

*******
*******
*******
*******
*******
*******
*******

输入

8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg

输出

*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g

解题思路:

1.首先用一个map数组保存输入的字母矩阵,然后用一个同样大小vis数组用来记录单词“yizhong”所在的位置。

2.首先遍历字母矩阵,先找到字母“y”所在的位置,然后遍历8个方向寻找是否有字母“i”。

3.如果存在字母“i”,沿着字母“i”所在的方向进行搜索,直到7个字母都存在为止。

#include<iostream>
#include<string>
using namespace std;

string word = "yizhong";
char map[110][110];
int vis[110][110] = { 0 };
int x[8] = { 1,0,1,-1,0,-1,1,-1 }, y[8] = { 0,1,1,0,-1,-1,-1,1 };//8个方向

void dfs(int px, int py, int k, int cnt)   //分别代表当前点的坐标x,y,以及方向k,以及当前第几个点now
{
	if (cnt == 6)    //表示走到头了
	{
		for (int i = 0; i < 7; i++)
		{
			vis[px - i*x[k]][py - i*y[k]] = 1;
		}
	}
	else {
		if (map[px + x[k]][py + y[k]] == word[cnt + 1])
		{
			dfs(px + x[k], py + y[k], k, cnt + 1);
		}
	}
}

int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> map[i];
	}
	for(int i= 0;i<n;i++)
		for (int j = 0; j < n; j++)
		{
			if (map[i][j] == 'y')   //出现y才开始四周寻找
			{
				for (int k = 0; k < 8; k++)
				{
					if (map[i + x[k]][j + y[k]] == 'i')
						dfs(i + x[k], j + y[k], k, 1);
				}
			}
		}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (vis[i][j])
				cout << map[i][j];
			else cout << "*";
		}
		cout << endl;
	}
	return 0;
}

 

posted @ 2020-02-23 16:48  Hu_YaYa  阅读(24)  评论(0)    收藏  举报