P1101 单词方阵

 

 题目大意:

 找出沿一方向连续出现的“yizhong”,其他字符变成“*”

思路:

如果发现了这个单词的开头“y”,然后就dfs搜索,直到找到了yizhong整个单词。

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring> 
#include<cmath>
using namespace std;
long long n;
char map[101][101];//表示N*N的字母矩阵 
char ci[]="yizhong";
long long dx[8]={1,1,0,1,0,-1,-1,-1};
long long dy[8]={1,-1,1,0,-1,-1,1,0};//8个方位 
long long bj[101][101];//标记数组 
void dfs(long long idx,long long idy,long long jg,long long fx){
    if(jg==7){
        for(int i=1;i<=7;i++){ 
            bj[idx][idy]=1;//记录方位 
            idx-=dx[fx];//更新 
            idy-=dy[fx];//更新 
        }
        return;
    }
    else{   
        if(fx==-1){
            for(int i=0;i<8;i++){//枚举8个方位 
                if(dx[i]+idx>=1&&dy[i]+idy>=1&&dx[i]+idx<=n&&dy[i]+idy<=n&&ci[jg]==map[dx[i]+idx][dy[i]+idy]){//判断是否越界,当前位置是否符合字母 
                    dfs(dx[i]+idx,dy[i]+idy,jg+1,i);//更新位置,继续搜索 
                }
            }   
        }
        else{
            if(dx[fx]+idx>=1&&dy[fx]+idy>=1&&dx[fx]+idx<=n&&dy[fx]+idy<=n&&ci[jg]==map[dx[fx]+idx][dy[fx]+idy]){//判断是否越界,当前位置是否符合字母  
                dfs(dx[fx]+idx,dy[fx]+idy,jg+1,fx);//更新位置,继续搜索
            }
        }
    }
}
int main(){
    scanf("%lld",&n);//输入 
    for(int i=1;i<=n;i++){    
        for(int j=1;j<=n;j++){
            cin>>map[i][j];//输入字母矩阵 
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(map[i][j]=='y'){//如果找到了'y' 
                dfs(i,j,1,-1);//dfs搜索 
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(bj[i][j]==1){
                cout<<map[i][j];//输出 
            }
            else{
                printf("*");
            }
        }
        printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/shanxx/p/12894527.html