洛谷 P1101 单词方阵刷题笔记

题目 https://www.luogu.com.cn/problem/P1101

题目要求输出包含 yizhong 所有方向排列的矩阵图

观察答案除了yizhong 均为星号 

因此我们可以用bool数组来标记每个位置的状态 

定义星号为无效状态 false

我们对原矩阵图 进行遍历 

每当找到一个y就试一下它各个方向是否满足 

yizhong

如果有一个方向满足条件 就将该方向所有满足条件的位置打上有效标志 

题目规定可以交叉可以共用 因为我们有效状态都是标记为true 

所以一个位置标记几次true都没事 对我们的答案没有影响

完整代码

#include<bits/stdc++.h>
using namespace std;
const int N=110;
char a[N][N];
int n;
char c[8]={'y','i','z','h','o','n','g'}; //用于检查答案的数组 
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
//搜索的八个方向的数组 搜索小技巧 
bool b[N][N];//状态数组 
void check(int x,int y){
    for(int i=0;i<8;i++){
    
        for(int j = 0;j <= 6;j++)
        {
            int dx = x + j*dir[i][0];
            int dy = y + j*dir[i][1];
            //搜索该方向所有位置是否匹配 
            if(a[dx][dy]  != c[j]){
                break ;//有一个不匹配就退出当前循环 
            }
            
            if(a[dx][dy]=='g')
            {
             //当前循环完毕所有条件均匹配 将沿途位置打上有效的标记 
                for(int j = 0;j <= 6;j++)
                {
                    int dx = x + j*dir[i][0];
                    int dy = y + j*dir[i][1];
                    if(a[dx][dy]  == c[j])
                    {
                            b[dx][dy] = true;
                    }
                }
                
            }
        }
    }
    
}
int main(){
    cin>>n;
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= n;j++){
            cin>>a[i][j];
        }
    }    
    
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= n;j++){
            if(a[i][j]=='y'){//遍历检查y 
                check(i,j);
            }
        }
    }
    
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= n;j++){
            if(b[i][j]==true){//如果有效输出原来位置的字母 
                cout<<a[i][j];
            }else{
                cout<<'*';
            }
        }
        cout<<endl;
    }    
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值