洛谷 P1101 单词方阵

P1101 单词方阵 - 洛谷

题目描述

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

输入格式

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

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

输出格式

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

输入输出样例

输入 #1

markdown

7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa

输出 #1

markdown

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

输入 #2

markdown

8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hghrwth
iwdfgng
yyyyggg

输出 #2

markdown

*yizhong
GYi*****
n********
o********
h********
z********
i********
y********

思路:

就是暴力,对任意一个点进行八个方向的暴力搜七个字符

代码如下:

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

int dx[] = {0, 1, 1, 1, 0, -1, -1, -1};
int dy[] = {1, 1, 0, -1, -1, -1, 0, 1};
char mp[301][301];
bool word[301][301];
string s = "yizhong"; // 0~6下标  
int n;

void dfs(int x, int y) 
{
    for(int i = 0; i < 8; i++) 
	{ // 八个方向的搜索 
        int dicx = dx[i]; // 当前方向记录下来 
        int dicy = dy[i];
        
        int cnt = 0;
        
        int tx = x;//用tx,ty继承参数 
        int ty = y;
        
        bool valid = true;
        for(int k = 0; k < 7; k++) //对一个方向搜七个字符 
		{ // 检查7个字符 
            if(tx < 1 || tx > n || ty < 1 || ty > n || mp[tx][ty] != s[k])//如果有一个为真那么不成立,直接break 
			{
           		valid = false;
                break;
            }
            tx += dicx;
            ty += dicy;
        }
        if(valid) 
		{ // 如果这个方向有效 
            tx = x;
            ty = y;
            for(int k = 0; k < 7; k++) 
			{
                word[tx][ty] = true;
                tx += dicx;
                ty += dicy;
            }
        }
    }
}

int main() 
{
    cin >> n;
    for (int i = 1; i <= n; i++) 
	{
        for (int j = 1; j <= n; j++) 
		{
            cin >> mp[i][j];
        }
    }
    for (int i = 1; i <= n; i++) 
	{
        for (int j = 1; j <= n; j++) 
		{
            if (mp[i][j] == 'y') //如果符合第一个 
			{ 
                dfs(i, j); 
            }
        }
    }
    for (int i = 1; i <= n; i++) 
	{
        for (int j = 1; j <= n; j++) 
		{
            if (word[i][j]) 
                cout << mp[i][j];
            else 
                cout << '*';
        }
        cout << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值